diff --git a/lib/lv_drivers/.gitignore b/lib/lv_drivers/.gitignore index fd73aaa..953fe48 100644 --- a/lib/lv_drivers/.gitignore +++ b/lib/lv_drivers/.gitignore @@ -1,2 +1,3 @@ **/*.o -**/*.d \ No newline at end of file +**/*.d +build/* diff --git a/lib/lv_drivers/CMakeLists.txt b/lib/lv_drivers/CMakeLists.txt index fadccaa..74a666b 100644 --- a/lib/lv_drivers/CMakeLists.txt +++ b/lib/lv_drivers/CMakeLists.txt @@ -20,6 +20,7 @@ target_include_directories(lv_drivers SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) find_package(PkgConfig) pkg_check_modules(PKG_WAYLAND wayland-client wayland-cursor wayland-protocols xkbcommon) +pkg_check_modules(PKG_LVGL lvgl) target_link_libraries(lv_drivers PUBLIC lvgl ${PKG_WAYLAND_LIBRARIES}) if("${LIB_INSTALL_DIR}" STREQUAL "") @@ -38,7 +39,16 @@ install( PATTERN ".git*" EXCLUDE PATTERN "CMakeFiles" EXCLUDE PATTERN "docs" EXCLUDE - PATTERN "lib" EXCLUDE) + PATTERN "lib" EXCLUDE + PATTERN "*.pc.in" EXCLUDE) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PKG_LVGL_CFLAGS}") + +configure_file("${CMAKE_SOURCE_DIR}/lv-drivers.pc.in" lv-drivers.pc @ONLY) + +install( + FILES "${CMAKE_BINARY_DIR}/lv-drivers.pc" + DESTINATION "${LIB_INSTALL_DIR}/pkgconfig/") file(GLOB LV_DRIVERS_PUBLIC_HEADERS "${CMAKE_SOURCE_DIR}/lv_drv_conf.h") diff --git a/lib/lv_drivers/README.md b/lib/lv_drivers/README.md index 6a2da33..98bdac3 100644 --- a/lib/lv_drivers/README.md +++ b/lib/lv_drivers/README.md @@ -1,6 +1,6 @@ # Display and Touch pad drivers -Display controller and touchpad driver to can be directly used with [LittlevGL](https://littlevgl.com). +Display controller and touchpad driver to can be directly used with [LVGL](https://lvgl.io/). To learn more about using drivers in LittlevGL visit the [Porting guide](https://docs.lvgl.io/latest/en/html/porting/index.html). diff --git a/lib/lv_drivers/display/drm.c b/lib/lv_drivers/display/drm.c index 9cec6e3..bbf69c1 100644 --- a/lib/lv_drivers/display/drm.c +++ b/lib/lv_drivers/display/drm.c @@ -9,19 +9,14 @@ #include "drm.h" #if USE_DRM -#include -#include -#include -#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include #include -#include +#include #include #include @@ -41,7 +36,7 @@ struct drm_buffer { uint32_t pitch; uint32_t offset; unsigned long int size; - void * map; + uint8_t * map; uint32_t fb_handle; }; @@ -65,8 +60,9 @@ struct drm_dev { drmModePropertyPtr plane_props[128]; drmModePropertyPtr crtc_props[128]; drmModePropertyPtr conn_props[128]; - struct drm_buffer drm_bufs[2]; /* DUMB buffers */ - struct drm_buffer *cur_bufs[2]; /* double buffering handling */ + struct drm_buffer drm_bufs[2]; /*DUMB buffers*/ + uint8_t active_drm_buf_idx; /*Double buffering handling*/ + lv_disp_draw_buf_t draw_buf; } drm_dev; static uint32_t get_plane_property_id(const char *name) @@ -117,7 +113,18 @@ static uint32_t get_conn_property_id(const char *name) static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data) { + LV_UNUSED(fd); + LV_UNUSED(sequence); + LV_UNUSED(tv_sec); + LV_UNUSED(tv_usec); + LV_UNUSED(user_data); + dbg("flip"); + + if(drm_dev.req) { + drmModeAtomicFree(drm_dev.req); + drm_dev.req = NULL; + } } static int drm_get_plane_props(void) @@ -244,7 +251,7 @@ static int drm_dmabuf_set_plane(struct drm_buffer *buf) { int ret; static int first = 1; - uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT; + uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK; drm_dev.req = drmModeAtomicAlloc(); @@ -283,6 +290,7 @@ static int drm_dmabuf_set_plane(struct drm_buffer *buf) static int find_plane(unsigned int fourcc, uint32_t *plane_id, uint32_t crtc_id, uint32_t crtc_idx) { + LV_UNUSED(crtc_id); drmModePlaneResPtr planes; drmModePlanePtr plane; unsigned int i; @@ -393,7 +401,7 @@ static int drm_find_connector(void) drm_dev.mmWidth = conn->mmWidth; drm_dev.mmHeight = conn->mmHeight; - memcpy(&drm_dev.mode, &conn->modes[0], sizeof(drmModeModeInfo)); + lv_memcpy(&drm_dev.mode, &conn->modes[0], sizeof(drmModeModeInfo)); if (drmModeCreatePropertyBlob(drm_dev.fd, &drm_dev.mode, sizeof(drm_dev.mode), &drm_dev.blob_id)) { @@ -464,7 +472,7 @@ static int drm_find_connector(void) drmModeFreeEncoder(enc); } - drm_dev.crtc_idx = -1; + drm_dev.crtc_idx = UINT32_MAX; for (i = 0; i < res->count_crtcs; ++i) { if (drm_dev.crtc_id == res->crtcs[i]) { @@ -473,7 +481,7 @@ static int drm_find_connector(void) } } - if (drm_dev.crtc_idx == -1) { + if (drm_dev.crtc_idx == UINT32_MAX) { err("drm: CRTC not found"); goto free_res; } @@ -614,7 +622,7 @@ static int drm_allocate_dumb(struct drm_buffer *buf) int ret; /* create dumb buffer */ - memset(&creq, 0, sizeof(creq)); + lv_memset(&creq, 0, sizeof(creq)); creq.width = drm_dev.width; creq.height = drm_dev.height; creq.bpp = LV_COLOR_DEPTH; @@ -626,12 +634,10 @@ static int drm_allocate_dumb(struct drm_buffer *buf) buf->handle = creq.handle; buf->pitch = creq.pitch; - dbg("pitch %d", buf->pitch); buf->size = creq.size; - dbg("size %d", buf->size); /* prepare buffer for memory mapping */ - memset(&mreq, 0, sizeof(mreq)); + lv_memset(&mreq, 0, sizeof(mreq)); mreq.handle = creq.handle; ret = drmIoctl(drm_dev.fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq); if (ret) { @@ -640,6 +646,7 @@ static int drm_allocate_dumb(struct drm_buffer *buf) } buf->offset = mreq.offset; + info("size %lu pitch %u offset %u", buf->size, buf->pitch, buf->offset); /* perform actual memory mapping */ buf->map = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_dev.fd, mreq.offset); @@ -649,7 +656,7 @@ static int drm_allocate_dumb(struct drm_buffer *buf) } /* clear the framebuffer to 0 (= full transparency in ARGB8888) */ - memset(buf->map, 0, creq.size); + lv_memset(buf->map, 0, creq.size); /* create framebuffer object for the dumb-buffer */ handles[0] = creq.handle; @@ -669,7 +676,7 @@ static int drm_setup_buffers(void) { int ret; - /* Allocate DUMB buffers */ + /*Allocate DUMB buffers*/ ret = drm_allocate_dumb(&drm_dev.drm_bufs[0]); if (ret) return ret; @@ -678,80 +685,61 @@ static int drm_setup_buffers(void) if (ret) return ret; - /* Set buffering handling */ - drm_dev.cur_bufs[0] = NULL; - drm_dev.cur_bufs[1] = &drm_dev.drm_bufs[0]; - return 0; } -void drm_wait_vsync(lv_disp_drv_t *disp_drv) +void drm_wait_vsync(lv_disp_drv_t * disp_drv) { - int ret; - fd_set fds; - FD_ZERO(&fds); - FD_SET(drm_dev.fd, &fds); - - do { - ret = select(drm_dev.fd + 1, &fds, NULL, NULL, NULL); - } while (ret == -1 && errno == EINTR); - - if (ret < 0) { - err("select failed: %s", strerror(errno)); - drmModeAtomicFree(drm_dev.req); - drm_dev.req = NULL; - return; + while(drm_dev.req) { + struct pollfd pfd; + pfd.fd = drm_dev.fd; + pfd.events = POLLIN; + + int ret; + do { + ret = poll(&pfd, 1, -1); + } while (ret == -1 && errno == EINTR); + + if(ret > 0) + drmHandleEvent(drm_dev.fd, &drm_dev.drm_event_ctx); + else { + err("poll failed: %s", strerror(errno)); + return; + } } - if (FD_ISSET(drm_dev.fd, &fds)) - drmHandleEvent(drm_dev.fd, &drm_dev.drm_event_ctx); - - drmModeAtomicFree(drm_dev.req); - drm_dev.req = NULL; + lv_disp_flush_ready(disp_drv); } -void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +void drm_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { - struct drm_buffer *fbuf = drm_dev.cur_bufs[1]; - lv_coord_t w = (area->x2 - area->x1 + 1); - lv_coord_t h = (area->y2 - area->y1 + 1); - int i, y; - - dbg("x %d:%d y %d:%d w %d h %d", area->x1, area->x2, area->y1, area->y2, w, h); - - /* Partial update */ - if ((w != drm_dev.width || h != drm_dev.height) && drm_dev.cur_bufs[0]) - memcpy(fbuf->map, drm_dev.cur_bufs[0]->map, fbuf->size); - - for (y = 0, i = area->y1 ; i <= area->y2 ; ++i, ++y) { - memcpy((uint8_t *)fbuf->map + (area->x1 * (LV_COLOR_SIZE/8)) + (fbuf->pitch * i), - (uint8_t *)color_p + (w * (LV_COLOR_SIZE/8) * y), - w * (LV_COLOR_SIZE/8)); + struct drm_buffer *fbuf = &drm_dev.drm_bufs[drm_dev.active_drm_buf_idx ^ 1]; + + if(!disp_drv->direct_mode) { + /*Backwards compatibility: Non-direct flush */ + uint32_t w = (area->x2 - area->x1) + 1; + for (int y = 0, i = area->y1; i <= area->y2 ; ++i, ++y) { + lv_memcpy(fbuf->map + (area->x1 * (LV_COLOR_SIZE / 8)) + (fbuf->pitch * i), + (uint8_t *)color_p + (w * (LV_COLOR_SIZE / 8) * y), + w * (LV_COLOR_SIZE / 8)); + } } - if (drm_dev.req) - drm_wait_vsync(disp_drv); + if(lv_disp_flush_is_last(disp_drv)) { + /*Request buffer swap*/ + if(drm_dmabuf_set_plane(fbuf)) { + err("Flush fail"); + return; + } + else + dbg("Flush done"); - /* show fbuf plane */ - if (drm_dmabuf_set_plane(fbuf)) { - err("Flush fail"); - return; + drm_dev.active_drm_buf_idx ^= 1; } - else - dbg("Flush done"); - - if (!drm_dev.cur_bufs[0]) - drm_dev.cur_bufs[1] = &drm_dev.drm_bufs[1]; - else - drm_dev.cur_bufs[1] = drm_dev.cur_bufs[0]; - - drm_dev.cur_bufs[0] = fbuf; - - lv_disp_flush_ready(disp_drv); } #if LV_COLOR_DEPTH == 32 -#define DRM_FOURCC DRM_FORMAT_ARGB8888 +#define DRM_FOURCC DRM_FORMAT_XRGB8888 #elif LV_COLOR_DEPTH == 16 #define DRM_FOURCC DRM_FORMAT_RGB565 #else @@ -770,7 +758,7 @@ void drm_get_sizes(lv_coord_t *width, lv_coord_t *height, uint32_t *dpi) *dpi = DIV_ROUND_UP(drm_dev.width * 25400, drm_dev.mmWidth * 1000); } -void drm_init(void) +int drm_init(void) { int ret; @@ -778,7 +766,7 @@ void drm_init(void) if (ret) { close(drm_dev.fd); drm_dev.fd = -1; - return; + return -1; } ret = drm_setup_buffers(); @@ -786,10 +774,28 @@ void drm_init(void) err("DRM buffer allocation failed"); close(drm_dev.fd); drm_dev.fd = -1; - return; + return -1; } info("DRM subsystem and buffer mapped successfully"); + return 0; +} + +int drm_disp_drv_init(lv_disp_drv_t * disp_drv) +{ + lv_disp_drv_init(disp_drv); + + int ret = drm_init(); + if(ret) return ret; + + lv_disp_draw_buf_init(&drm_dev.draw_buf, drm_dev.drm_bufs[1].map, drm_dev.drm_bufs[0].map, drm_dev.width * drm_dev.height); + disp_drv->draw_buf = &drm_dev.draw_buf; + disp_drv->direct_mode = true; + disp_drv->hor_res = drm_dev.width; + disp_drv->ver_res = drm_dev.height; + disp_drv->flush_cb = drm_flush; + disp_drv->wait_cb = drm_wait_vsync; + return 0; } void drm_exit(void) diff --git a/lib/lv_drivers/display/drm.h b/lib/lv_drivers/display/drm.h index ebf2e28..9aa6dab 100644 --- a/lib/lv_drivers/display/drm.h +++ b/lib/lv_drivers/display/drm.h @@ -40,13 +40,14 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -void drm_init(void); -void drm_get_sizes(lv_coord_t *width, lv_coord_t *height, uint32_t *dpi); + +int drm_init(void); /*Deprecated: Use drm_disp_drv_init instead*/ +int drm_disp_drv_init(lv_disp_drv_t * disp_drv); +void drm_get_sizes(lv_coord_t * width, lv_coord_t * height, uint32_t * dpi); void drm_exit(void); void drm_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p); void drm_wait_vsync(lv_disp_drv_t * drv); - /********************** * MACROS **********************/ diff --git a/lib/lv_drivers/display/fbdev.c b/lib/lv_drivers/display/fbdev.c index fe8d2ff..f649703 100644 --- a/lib/lv_drivers/display/fbdev.c +++ b/lib/lv_drivers/display/fbdev.c @@ -101,7 +101,7 @@ void fbdev_init(void) // Make sure that the display is on. if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) { perror("ioctl(FBIOBLANK)"); - return; + // Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK. } #if USE_BSD_FBDEV @@ -195,8 +195,8 @@ void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color long int byte_location = 0; unsigned char bit_location = 0; - /*32 or 24 bit per pixel*/ - if(vinfo.bits_per_pixel == 32 || vinfo.bits_per_pixel == 24) { + /*32 bit per pixel*/ + if(vinfo.bits_per_pixel == 32) { uint32_t * fbp32 = (uint32_t *)fbp; int32_t y; for(y = act_y1; y <= act_y2; y++) { @@ -205,6 +205,23 @@ void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color color_p += w; } } + /*24 bit per pixel*/ + else if(vinfo.bits_per_pixel == 24 && LV_COLOR_DEPTH == 32) { + uint8_t * fbp8 = (uint8_t *)fbp; + lv_coord_t x; + int32_t y; + uint8_t *pixel; + for(y = act_y1; y <= act_y2; y++) { + location = (act_x1 + vinfo.xoffset) + (y + vinfo.yoffset) * finfo.line_length / 3; + for (x = 0; x < w; ++x) { + pixel = (uint8_t *)(&color_p[x]); + fbp8[3 * (location + x)] = pixel[0]; + fbp8[3 * (location + x) + 1] = pixel[1]; + fbp8[3 * (location + x) + 2] = pixel[2]; + } + color_p += w; + } + } /*16 bit per pixel*/ else if(vinfo.bits_per_pixel == 16) { uint16_t * fbp16 = (uint16_t *)fbp; diff --git a/lib/lv_drivers/indev/XPT2046.c b/lib/lv_drivers/indev/XPT2046.c index f27fa76..c63b27f 100644 --- a/lib/lv_drivers/indev/XPT2046.c +++ b/lib/lv_drivers/indev/XPT2046.c @@ -55,9 +55,9 @@ void xpt2046_init(void) /** * Get the current position and state of the touchpad * @param data store the read data here - * @return false: because no ore data to be read + * @return void */ -bool xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) +void xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { static int16_t last_x = 0; static int16_t last_y = 0; @@ -105,7 +105,7 @@ bool xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) data->point.x = x; data->point.y = y; - return false; + data->continue_reading = false; /* No more data to be read */ } /********************** diff --git a/lib/lv_drivers/indev/XPT2046.h b/lib/lv_drivers/indev/XPT2046.h index 7eee8c0..043b6fc 100644 --- a/lib/lv_drivers/indev/XPT2046.h +++ b/lib/lv_drivers/indev/XPT2046.h @@ -41,7 +41,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ void xpt2046_init(void); -bool xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); +void xpt2046_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); /********************** * MACROS diff --git a/lib/lv_drivers/indev/evdev.c b/lib/lv_drivers/indev/evdev.c index 4d46b5b..2a62129 100644 --- a/lib/lv_drivers/indev/evdev.c +++ b/lib/lv_drivers/indev/evdev.c @@ -12,6 +12,7 @@ #include #include #include +#include #if USE_BSD_EVDEV #include #else @@ -22,230 +23,202 @@ #include "xkb.h" #endif /* USE_XKB */ -/********************* - * DEFINES - *********************/ - /********************** - * TYPEDEFS + * STATIC VARIABLES **********************/ -/********************** - * STATIC PROTOTYPES - **********************/ -int map(int x, int in_min, int in_max, int out_min, int out_max); +evdev_device_t global_dsc; /********************** - * STATIC VARIABLES + * STATIC FUNCTIONS **********************/ -int evdev_fd = -1; -int evdev_root_x; -int evdev_root_y; -int evdev_button; -int evdev_key_val; +static int _evdev_process_key(uint16_t code, bool pressed) +{ +#if USE_XKB + return xkb_process_key(code, pressed); +#else + LV_UNUSED(pressed); + switch(code) { + case KEY_UP: + return LV_KEY_UP; + case KEY_DOWN: + return LV_KEY_DOWN; + case KEY_RIGHT: + return LV_KEY_RIGHT; + case KEY_LEFT: + return LV_KEY_LEFT; + case KEY_ESC: + return LV_KEY_ESC; + case KEY_DELETE: + return LV_KEY_DEL; + case KEY_BACKSPACE: + return LV_KEY_BACKSPACE; + case KEY_ENTER: + return LV_KEY_ENTER; + case KEY_NEXT: + case KEY_TAB: + return LV_KEY_NEXT; + case KEY_PREVIOUS: + return LV_KEY_PREV; + case KEY_HOME: + return LV_KEY_HOME; + case KEY_END: + return LV_KEY_END; + default: + return 0; + } +#endif /*USE_XKB*/ +} -/********************** - * MACROS - **********************/ +static int _evdev_calibrate(int v, int in_min, int in_max, int out_min, int out_max) +{ + if(in_min != in_max) v = (v - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + return LV_CLAMP(out_min, v, out_max); +} + +static lv_point_t _evdev_process_pointer(lv_indev_drv_t * drv, int x, int y) +{ + evdev_device_t * dsc = drv->user_data ? drv->user_data : &global_dsc; + + int swapped_x = dsc->swap_axes ? y : x; + int swapped_y = dsc->swap_axes ? x : y; + + int offset_x = 0; /*Not lv_disp_get_offset_x(drv->disp) for bc*/ + int offset_y = 0; /*Not lv_disp_get_offset_y(drv->disp) for bc*/ + int width = lv_disp_get_hor_res(drv->disp); + int height = lv_disp_get_ver_res(drv->disp); + + lv_point_t p; + p.x = _evdev_calibrate(swapped_x, dsc->hor_min, dsc->hor_max, offset_x, offset_x + width - 1); + p.y = _evdev_calibrate(swapped_y, dsc->ver_min, dsc->ver_max, offset_y, offset_y + height - 1); + return p; +} /********************** * GLOBAL FUNCTIONS **********************/ -/** - * Initialize the evdev interface - */ -void evdev_init(void) +void evdev_init() { - if (!evdev_set_file(EVDEV_NAME)) { - return; - } + evdev_device_init(&global_dsc); +#ifdef EVDEV_SWAP_AXES + evdev_device_set_swap_axes(&global_dsc, EVDEV_SWAP_AXES); +#endif +#if EVDEV_CALIBRATE + evdev_device_set_calibration(&global_dsc, EVDEV_HOR_MIN, EVDEV_VER_MIN, EVDEV_HOR_MAX, EVDEV_VER_MAX); +#endif + evdev_device_set_file(&global_dsc, EVDEV_NAME); +} + +void evdev_device_init(evdev_device_t * dsc) +{ + lv_memset(dsc, 0, sizeof(evdev_device_t)); + dsc->fd = -1; #if USE_XKB xkb_init(); #endif } -/** - * reconfigure the device file for evdev - * @param dev_name set the evdev device filename - * @return true: the device file set complete - * false: the device file doesn't exist current system - */ -bool evdev_set_file(char* dev_name) -{ - if(evdev_fd != -1) { - close(evdev_fd); - } -#if USE_BSD_EVDEV - evdev_fd = open(dev_name, O_RDWR | O_NOCTTY); -#else - evdev_fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY); -#endif - if(evdev_fd == -1) { - perror("unable to open evdev interface:"); +bool evdev_set_file(const char * dev_path) +{ + return evdev_device_set_file(&global_dsc, dev_path); +} + +bool evdev_device_set_file(evdev_device_t * dsc, const char * dev_path) +{ + /*Reset state*/ + dsc->root_x = 0; + dsc->root_y = 0; + dsc->key = 0; + dsc->state = LV_INDEV_STATE_RELEASED; + + /*Close previous*/ + if(dsc->fd >= 0) { + close(dsc->fd); + dsc->fd = -1; + } + if(!dev_path) return false; + + /*Open new*/ + dsc->fd = open(dev_path, O_RDONLY | O_NOCTTY | O_CLOEXEC); + if(dsc->fd < 0) { + LV_LOG_ERROR("open failed: %s", strerror(errno)); + return false; + } + if(fcntl(dsc->fd, F_SETFL, O_NONBLOCK) < 0) { + LV_LOG_ERROR("fcntl failed: %s", strerror(errno)); + close(dsc->fd); + dsc->fd = -1; return false; - } + } -#if USE_BSD_EVDEV - fcntl(evdev_fd, F_SETFL, O_NONBLOCK); -#else - fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK); -#endif + return true; +} - evdev_root_x = 0; - evdev_root_y = 0; - evdev_key_val = 0; - evdev_button = LV_INDEV_STATE_REL; +void evdev_device_set_swap_axes(evdev_device_t * dsc, bool swap_axes) +{ + dsc->swap_axes = swap_axes; +} - return true; +void evdev_device_set_calibration(evdev_device_t * dsc, int ver_min, int hor_min, int ver_max, int hor_max) +{ + dsc->ver_min = ver_min; + dsc->hor_min = hor_min; + dsc->ver_max = ver_max; + dsc->hor_max = hor_max; } -/** - * Get the current position and state of the evdev - * @param data store the evdev data here - */ + void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data) { - struct input_event in; + evdev_device_t * dsc = drv->user_data ? drv->user_data : &global_dsc; + if(dsc->fd < 0) return; - while(read(evdev_fd, &in, sizeof(struct input_event)) > 0) { + /*Update dsc with buffered events*/ + struct input_event in = { 0 }; + while(read(dsc->fd, &in, sizeof(in)) > 0) { if(in.type == EV_REL) { - if(in.code == REL_X) - #if EVDEV_SWAP_AXES - evdev_root_y += in.value; - #else - evdev_root_x += in.value; - #endif - else if(in.code == REL_Y) - #if EVDEV_SWAP_AXES - evdev_root_x += in.value; - #else - evdev_root_y += in.value; - #endif - } else if(in.type == EV_ABS) { - if(in.code == ABS_X) - #if EVDEV_SWAP_AXES - evdev_root_y = in.value; - #else - evdev_root_x = in.value; - #endif - else if(in.code == ABS_Y) - #if EVDEV_SWAP_AXES - evdev_root_x = in.value; - #else - evdev_root_y = in.value; - #endif - else if(in.code == ABS_MT_POSITION_X) - #if EVDEV_SWAP_AXES - evdev_root_y = in.value; - #else - evdev_root_x = in.value; - #endif - else if(in.code == ABS_MT_POSITION_Y) - #if EVDEV_SWAP_AXES - evdev_root_x = in.value; - #else - evdev_root_y = in.value; - #endif + if(in.code == REL_X) dsc->root_x += in.value; + else if(in.code == REL_Y) dsc->root_y += in.value; + } + else if(in.type == EV_ABS) { + if(in.code == ABS_X || in.code == ABS_MT_POSITION_X) dsc->root_x = in.value; + else if(in.code == ABS_Y || in.code == ABS_MT_POSITION_Y) dsc->root_y = in.value; else if(in.code == ABS_MT_TRACKING_ID) { - if(in.value == -1) - evdev_button = LV_INDEV_STATE_REL; - else if(in.value == 0) - evdev_button = LV_INDEV_STATE_PR; + if(in.value == -1) dsc->state = LV_INDEV_STATE_RELEASED; + else if(in.value == 0) dsc->state = LV_INDEV_STATE_PRESSED; } - } else if(in.type == EV_KEY) { + } + else if(in.type == EV_KEY) { if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) { - if(in.value == 0) - evdev_button = LV_INDEV_STATE_REL; - else if(in.value == 1) - evdev_button = LV_INDEV_STATE_PR; - } else if(drv->type == LV_INDEV_TYPE_KEYPAD) { -#if USE_XKB - data->key = xkb_process_key(in.code, in.value != 0); -#else - switch(in.code) { - case KEY_BACKSPACE: - data->key = LV_KEY_BACKSPACE; - break; - case KEY_ENTER: - data->key = LV_KEY_ENTER; - break; - case KEY_PREVIOUS: - data->key = LV_KEY_PREV; - break; - case KEY_NEXT: - data->key = LV_KEY_NEXT; - break; - case KEY_UP: - data->key = LV_KEY_UP; - break; - case KEY_LEFT: - data->key = LV_KEY_LEFT; - break; - case KEY_RIGHT: - data->key = LV_KEY_RIGHT; - break; - case KEY_DOWN: - data->key = LV_KEY_DOWN; - break; - case KEY_TAB: - data->key = LV_KEY_NEXT; - break; - default: - data->key = 0; - break; - } -#endif /* USE_XKB */ - if (data->key != 0) { - /* Only record button state when actual output is produced to prevent widgets from refreshing */ - data->state = (in.value) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + if(in.value == 0) dsc->state = LV_INDEV_STATE_RELEASED; + else if(in.value == 1) dsc->state = LV_INDEV_STATE_PRESSED; + } + else { + dsc->key = _evdev_process_key(in.code, in.value != 0); + if(dsc->key) { + dsc->state = in.value ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->continue_reading = true; /*Keep following events in buffer for now*/ + break; } - evdev_key_val = data->key; - evdev_button = data->state; - return; } } } - if(drv->type == LV_INDEV_TYPE_KEYPAD) { - /* No data retrieved */ - data->key = evdev_key_val; - data->state = evdev_button; - return; + /*Process and store in data*/ + switch(drv->type) { + case LV_INDEV_TYPE_KEYPAD: + data->state = dsc->state; + data->key = dsc->key; + break; + case LV_INDEV_TYPE_POINTER: + data->state = dsc->state; + data->point = _evdev_process_pointer(drv, dsc->root_x, dsc->root_y); + break; + default: + break; } - if(drv->type != LV_INDEV_TYPE_POINTER) - return ; - /*Store the collected data*/ - -#if EVDEV_CALIBRATE - data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, drv->disp->driver->hor_res); - data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, drv->disp->driver->ver_res); -#else - data->point.x = evdev_root_x; - data->point.y = evdev_root_y; -#endif - - data->state = evdev_button; - - if(data->point.x < 0) - data->point.x = 0; - if(data->point.y < 0) - data->point.y = 0; - if(data->point.x >= drv->disp->driver->hor_res) - data->point.x = drv->disp->driver->hor_res - 1; - if(data->point.y >= drv->disp->driver->ver_res) - data->point.y = drv->disp->driver->ver_res - 1; - - return ; } -/********************** - * STATIC FUNCTIONS - **********************/ -int map(int x, int in_min, int in_max, int out_min, int out_max) -{ - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -} - -#endif +#endif /*USE_EVDEV*/ diff --git a/lib/lv_drivers/indev/evdev.h b/lib/lv_drivers/indev/evdev.h index c1b2280..541e61b 100644 --- a/lib/lv_drivers/indev/evdev.h +++ b/lib/lv_drivers/indev/evdev.h @@ -29,39 +29,81 @@ extern "C" { #include "lvgl/lvgl.h" #endif -/********************* - * DEFINES - *********************/ - /********************** * TYPEDEFS **********************/ +typedef struct { + /*Device*/ + int fd; + /*Config*/ + bool swap_axes; + int ver_min; + int hor_min; + int ver_max; + int hor_max; + /*State*/ + int root_x; + int root_y; + int key; + lv_indev_state_t state; +} evdev_device_t; + /********************** * GLOBAL PROTOTYPES **********************/ /** - * Initialize the evdev + * Initialize the global evdev device, as configured with EVDEV_NAME, + * EVDEV_SWAP_AXES, and EVDEV_CALIBRATE. */ -void evdev_init(void); +void evdev_init(); /** - * reconfigure the device file for evdev - * @param dev_name set the evdev device filename - * @return true: the device file set complete - * false: the device file doesn't exist current system + * Initialize an evdev device. + * @param dsc evdev device */ -bool evdev_set_file(char* dev_name); +void evdev_device_init(evdev_device_t * dsc); + /** - * Get the current position and state of the evdev - * @param data store the evdev data here + * Reconfigure the path for the global evdev device. + * @param dev_path device path, e.g., /dev/input/event0, or NULL to close + * @return whether the device was successfully opened */ -void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data); +bool evdev_set_file(const char * dev_path); +/** + * Configure or reconfigure the path for an evdev device. + * @param dsc evdev device + * @param dev_path device path, e.g., /dev/input/event0, or NULL to close + * @return whether the device was successfully opened + */ +bool evdev_device_set_file(evdev_device_t * dsc, const char * dev_path); + +/** + * Configure whether pointer coordinates of an evdev device sould be swapped. + * Default to false. + * @param dsc evdev device + * @param swap_axes whether to swap x and y axes + */ +void evdev_device_set_swap_axes(evdev_device_t * dsc, bool swap_axes); +/** + * Configure a coordinate transformation for an evdev device. Applied after + * axis swap, if any. Defaults to no transformation. + * @param dsc evdev device + * @param hor_min horizontal pointer coordinate mapped to 0 + * @param ver_min vertical pointer coordinate mapped to 0 + * @param ver_min pointer coordinate mapped to horizontal max of display + * @param ver_max pointer coordinate mapped to vertical max of display + */ +void evdev_device_set_calibration(evdev_device_t * dsc, int hor_min, int ver_min, int hor_max, int ver_max); -/********************** - * MACROS - **********************/ +/** + * Read callback for the input driver. + * @param drv input driver where drv->user_data is NULL for the global evdev + * device or an evdev_device_t pointer. + * @param data destination for input events + */ +void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data); #endif /* USE_EVDEV */ diff --git a/lib/lv_drivers/indev/libinput.c b/lib/lv_drivers/indev/libinput.c index fc995b1..d4f8e2a 100644 --- a/lib/lv_drivers/indev/libinput.c +++ b/lib/lv_drivers/indev/libinput.c @@ -74,7 +74,28 @@ static const struct libinput_interface interface = { **********************/ /** - * find connected input device with specific capabilities + * Determine the capabilities of a specific libinput device. + * @param device the libinput device to query + * @return the supported input capabilities + */ +libinput_capability libinput_query_capability(struct libinput_device *device) { + libinput_capability capability = LIBINPUT_CAPABILITY_NONE; + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD) + && (libinput_device_keyboard_has_key(device, KEY_ENTER) || libinput_device_keyboard_has_key(device, KEY_KPENTER))) + { + capability |= LIBINPUT_CAPABILITY_KEYBOARD; + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { + capability |= LIBINPUT_CAPABILITY_POINTER; + } + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { + capability |= LIBINPUT_CAPABILITY_TOUCH; + } + return capability; +} + +/** + * Find connected input device with specific capabilities * @param capabilities required device capabilities * @param force_rescan erase the device cache (if any) and rescan the file system for available devices * @return device node path (e.g. /dev/input/event0) for the first matching device or NULL if no device was found. @@ -87,7 +108,7 @@ char *libinput_find_dev(libinput_capability capabilities, bool force_rescan) { } /** - * find connected input devices with specific capabilities + * Find connected input devices with specific capabilities * @param capabilities required device capabilities * @param devices pre-allocated array to store the found device node paths (e.g. /dev/input/event0). The pointers are * safe to use until the next forceful device search. @@ -138,8 +159,8 @@ bool libinput_set_file_state(libinput_drv_state_t *state, char* dev_name) // citing libinput.h:libinput_path_remove_device: // > If no matching device exists, this function does nothing. if (state->libinput_device) { - state->libinput_device = libinput_device_unref(state->libinput_device); libinput_path_remove_device(state->libinput_device); + state->libinput_device = libinput_device_unref(state->libinput_device); } state->libinput_device = libinput_path_add_device(state->libinput_context, dev_name); @@ -195,6 +216,29 @@ void libinput_init_state(libinput_drv_state_t *state, char* path) #endif } +/** + * De-initialise a previously initialised driver state and free any dynamically allocated memory. Use this function if you want to + * reuse an existing driver state. + * @param state driver state to de-initialize + */ +void libinput_deinit_state(libinput_drv_state_t *state) +{ + if (state->libinput_device) { + libinput_path_remove_device(state->libinput_device); + libinput_device_unref(state->libinput_device); + } + + if (state->libinput_context) { + libinput_unref(state->libinput_context); + } + +#if USE_XKB + xkb_deinit_state(&(state->xkb_state)); +#endif + + lv_memzero(state, sizeof(libinput_drv_state_t)); +} + /** * Read available input events via libinput using the default driver state. Use this function if you only want * to connect a single device. @@ -296,18 +340,7 @@ static bool rescan_devices(void) { * as part of this function, we don't have to increase its reference count to keep it alive. * https://wayland.freedesktop.org/libinput/doc/latest/api/group__base.html#gaa797496f0150b482a4e01376bd33a47b */ - libinput_capability capabilities = LIBINPUT_CAPABILITY_NONE; - if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD) - && (libinput_device_keyboard_has_key(device, KEY_ENTER) || libinput_device_keyboard_has_key(device, KEY_KPENTER))) - { - capabilities |= LIBINPUT_CAPABILITY_KEYBOARD; - } - if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { - capabilities |= LIBINPUT_CAPABILITY_POINTER; - } - if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { - capabilities |= LIBINPUT_CAPABILITY_TOUCH; - } + libinput_capability capabilities = libinput_query_capability(device); libinput_path_remove_device(device); @@ -387,13 +420,13 @@ static void read_pointer(libinput_drv_state_t *state, struct libinput_event *eve case LIBINPUT_EVENT_TOUCH_MOTION: case LIBINPUT_EVENT_TOUCH_DOWN: touch_event = libinput_event_get_touch_event(event); - lv_coord_t x = libinput_event_touch_get_x_transformed(touch_event, drv->physical_hor_res > 0 ? drv->physical_hor_res : drv->hor_res) - drv->offset_x; - lv_coord_t y = libinput_event_touch_get_y_transformed(touch_event, drv->physical_ver_res > 0 ? drv->physical_ver_res : drv->ver_res) - drv->offset_y; - if (x < 0 || x > drv->hor_res || y < 0 || y > drv->ver_res) { + lv_coord_t x_touch = libinput_event_touch_get_x_transformed(touch_event, drv->physical_hor_res > 0 ? drv->physical_hor_res : drv->hor_res) - drv->offset_x; + lv_coord_t y_touch = libinput_event_touch_get_y_transformed(touch_event, drv->physical_ver_res > 0 ? drv->physical_ver_res : drv->ver_res) - drv->offset_y; + if (x_touch < 0 || x_touch > drv->hor_res || y_touch < 0 || y_touch > drv->ver_res) { break; /* ignore touches that are out of bounds */ } - state->most_recent_touch_point.x = x; - state->most_recent_touch_point.y = y; + state->most_recent_touch_point.x = x_touch; + state->most_recent_touch_point.y = y_touch; state->button = LV_INDEV_STATE_PR; break; case LIBINPUT_EVENT_TOUCH_UP: @@ -406,6 +439,16 @@ static void read_pointer(libinput_drv_state_t *state, struct libinput_event *eve state->most_recent_touch_point.x = LV_CLAMP(0, state->most_recent_touch_point.x, drv->hor_res - 1); state->most_recent_touch_point.y = LV_CLAMP(0, state->most_recent_touch_point.y, drv->ver_res - 1); break; + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: + pointer_event = libinput_event_get_pointer_event(event); + lv_coord_t x_pointer = libinput_event_pointer_get_absolute_x_transformed(pointer_event, drv->physical_hor_res > 0 ? drv->physical_hor_res : drv->hor_res) - drv->offset_x; + lv_coord_t y_pointer = libinput_event_pointer_get_absolute_y_transformed(pointer_event, drv->physical_ver_res > 0 ? drv->physical_ver_res : drv->ver_res) - drv->offset_y; + if (x_pointer < 0 || x_pointer > drv->hor_res || y_pointer < 0 || y_pointer > drv->ver_res) { + break; /* ignore pointer events that are out of bounds */ + } + state->most_recent_touch_point.x = x_pointer; + state->most_recent_touch_point.y = y_pointer; + break; case LIBINPUT_EVENT_POINTER_BUTTON: pointer_event = libinput_event_get_pointer_event(event); enum libinput_button_state button_state = libinput_event_pointer_get_button_state(pointer_event); diff --git a/lib/lv_drivers/indev/libinput_drv.h b/lib/lv_drivers/indev/libinput_drv.h index dd6e929..8dd8c43 100644 --- a/lib/lv_drivers/indev/libinput_drv.h +++ b/lib/lv_drivers/indev/libinput_drv.h @@ -70,7 +70,13 @@ typedef struct { **********************/ /** - * find connected input device with specific capabilities + * Determine the capabilities of a specific libinput device. + * @param device the libinput device to query + * @return the supported input capabilities + */ +libinput_capability libinput_query_capability(struct libinput_device *device); +/** + * Find connected input device with specific capabilities * @param capabilities required device capabilities * @param force_rescan erase the device cache (if any) and rescan the file system for available devices * @return device node path (e.g. /dev/input/event0) for the first matching device or NULL if no device was found. @@ -78,7 +84,7 @@ typedef struct { */ char *libinput_find_dev(libinput_capability capabilities, bool force_rescan); /** - * find connected input devices with specific capabilities + * Find connected input devices with specific capabilities * @param capabilities required device capabilities * @param devices pre-allocated array to store the found device node paths (e.g. /dev/input/event0). The pointers are * safe to use until the next forceful device search. @@ -99,6 +105,12 @@ void libinput_init(void); * @param path input device node path (e.g. /dev/input/event0) */ void libinput_init_state(libinput_drv_state_t *state, char* path); +/** + * De-initialise a previously initialised driver state and free any dynamically allocated memory. Use this function if you want to + * reuse an existing driver state. + * @param state driver state to de-initialize + */ +void libinput_deinit_state(libinput_drv_state_t *state); /** * Reconfigure the device file for libinput using the default driver state. Use this function if you only want * to connect a single device. diff --git a/lib/lv_drivers/indev/xkb.c b/lib/lv_drivers/indev/xkb.c index 7faffef..8e044be 100644 --- a/lib/lv_drivers/indev/xkb.c +++ b/lib/lv_drivers/indev/xkb.c @@ -73,6 +73,23 @@ bool xkb_init_state(xkb_drv_state_t *state) { #endif } +/** + * De-initialise a previously initialised driver state and free any dynamically allocated memory. Use this function if you want to + * reuse an existing driver state. + * @param state XKB driver state to use + */ +void xkb_deinit_state(xkb_drv_state_t *state) { + if (state->state) { + xkb_state_unref(state->state); + state->state = NULL; + } + + if (state->keymap) { + xkb_keymap_unref(state->keymap); + state->keymap = NULL; + } +} + /** * Set a new keymap to be used for processing future key events using the default driver state. Use * this function if you only want to connect a single device. @@ -95,19 +112,13 @@ bool xkb_set_keymap_state(xkb_drv_state_t *state, struct xkb_rule_names names) { xkb_keymap_unref(state->keymap); state->keymap = NULL; } - + state->keymap = xkb_keymap_new_from_names(context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS); if (!state->keymap) { perror("could not create XKB keymap"); return false; } - state->keymap = xkb_keymap_ref(state->keymap); - if (!state->keymap) { - perror("could not reference XKB keymap"); - return false; - } - if (state->state) { xkb_state_unref(state->state); state->state = NULL; @@ -119,12 +130,6 @@ bool xkb_set_keymap_state(xkb_drv_state_t *state, struct xkb_rule_names names) { return false; } - state->state = xkb_state_ref(state->state); - if (!state->state) { - perror("could not reference XKB state"); - return false; - } - return true; } diff --git a/lib/lv_drivers/indev/xkb.h b/lib/lv_drivers/indev/xkb.h index 5018747..5bc8d1b 100644 --- a/lib/lv_drivers/indev/xkb.h +++ b/lib/lv_drivers/indev/xkb.h @@ -60,6 +60,12 @@ bool xkb_init(void); * @return true if the initialisation was successful */ bool xkb_init_state(xkb_drv_state_t *state); +/** + * De-initialise a previously initialised driver state and free any dynamically allocated memory. Use this function if you want to + * reuse an existing driver state. + * @param state XKB driver state to use + */ +void xkb_deinit_state(xkb_drv_state_t *state); /** * Set a new keymap to be used for processing future key events using the default driver state. Use * this function if you only want to connect a single device. diff --git a/lib/lv_drivers/library.json b/lib/lv_drivers/library.json index 7299869..a8d331a 100644 --- a/lib/lv_drivers/library.json +++ b/lib/lv_drivers/library.json @@ -1,6 +1,6 @@ { "name": "lv_drivers", - "version": "8.3.0", + "version": "9.0.0-dev", "keywords": "littlevgl, lvgl, driver, display, touchpad", "description": "Drivers for LittlevGL graphics library.", "repository": { diff --git a/lib/lv_drivers/lv-drivers.pc.in b/lib/lv_drivers/lv-drivers.pc.in new file mode 100644 index 0000000..fc71252 --- /dev/null +++ b/lib/lv_drivers/lv-drivers.pc.in @@ -0,0 +1,11 @@ +prefix="@CMAKE_INSTALL_PREFIX@" +includedir="${prefix}/@INC_INSTALL_DIR@" +libdir=${prefix}/lib + +Name: lv-drivers +Description: Display controller and touchpad driver that can be directly used with LVGL +URL: https://lvgl.io/ +Version: 9.0.0 +Cflags: -I${includedir} +Libs: -L${libdir} -llv_drivers +Requires: lvgl diff --git a/lib/lv_drivers/lv_drivers.mk b/lib/lv_drivers/lv_drivers.mk index 97d4621..71d0f28 100644 --- a/lib/lv_drivers/lv_drivers.mk +++ b/lib/lv_drivers/lv_drivers.mk @@ -1,10 +1,5 @@ -LV_DRIVERS_DIR_NAME ?= lv_drivers +LV_DRIVERS_PATH ?= ${shell pwd}/lv_drivers -override CFLAGS := -I$(LVGL_DIR) $(CFLAGS) +CSRCS += $(shell find $(LV_DRIVERS_PATH) -type f -name '*.c') +CFLAGS += "-I$(LV_DRIVERS_PATH)" -CSRCS += $(wildcard $(LVGL_DIR)/$(LV_DRIVERS_DIR_NAME)/*.c) -CSRCS += $(wildcard $(LVGL_DIR)/$(LV_DRIVERS_DIR_NAME)/wayland/*.c) -CSRCS += $(wildcard $(LVGL_DIR)/$(LV_DRIVERS_DIR_NAME)/indev/*.c) -CSRCS += $(wildcard $(LVGL_DIR)/$(LV_DRIVERS_DIR_NAME)/gtkdrv/*.c) -CSRCS += $(wildcard $(LVGL_DIR)/$(LV_DRIVERS_DIR_NAME)/display/*.c) -CSRCS += $(wildcard $(LVGL_DIR)/$(LV_DRIVERS_DIR_NAME)/sdl/*.c) diff --git a/lib/lv_drivers/lv_drv_conf_template.h b/lib/lv_drivers/lv_drv_conf_template.h index 8c70874..e77089b 100644 --- a/lib/lv_drivers/lv_drv_conf_template.h +++ b/lib/lv_drivers/lv_drv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_drv_conf.h - * Configuration file for v8.3.0 + * Configuration file for v9.0.0-dev */ /* @@ -110,6 +110,9 @@ /*Open two windows to test multi display support*/ # define SDL_DUAL_DISPLAY 0 + +/* Window Title */ +# define SDL_WINDOW_TITLE "TFT Simulator" #endif /*------------------- @@ -192,6 +195,13 @@ # endif #endif +/*---------------------------------------- + * X11 drivers (monitor, mouse, keyboard) + *---------------------------------------*/ +#ifndef USE_X11 +# define USE_X11 0 +#endif + /*---------------- * SSD1963 *--------------*/ diff --git a/lib/lv_drivers/sdl/sdl.c b/lib/lv_drivers/sdl/sdl.c index 0ac8192..b538f21 100644 --- a/lib/lv_drivers/sdl/sdl.c +++ b/lib/lv_drivers/sdl/sdl.c @@ -9,8 +9,8 @@ #include "sdl.h" #if USE_MONITOR || USE_SDL -#if LV_USE_GPU_SDL -# error "LV_USE_GPU_SDL must not be enabled" +#if LV_USE_DRAW_SDL +# error "LV_USE_DRAW_SDL must not be enabled" #endif #if USE_MONITOR @@ -47,6 +47,7 @@ # define SDL_FULLSCREEN 0 #endif +#include "sdl_common_internal.h" #include #include #include @@ -59,6 +60,9 @@ #define KEYBOARD_BUFFER_SIZE SDL_TEXTINPUTEVENT_TEXT_SIZE #endif +#ifndef SDL_WINDOW_TITLE +#define SDL_WINDOW_TITLE "TFT Simulator" +#endif /********************** * TYPEDEFS **********************/ @@ -96,17 +100,6 @@ monitor_t monitor; monitor_t monitor2; #endif -static volatile bool sdl_inited = false; - -static bool left_button_down = false; -static int16_t last_x = 0; -static int16_t last_y = 0; - -static int16_t wheel_diff = 0; -static lv_indev_state_t wheel_state = LV_INDEV_STATE_RELEASED; - -static char buf[KEYBOARD_BUFFER_SIZE]; - /********************** * MACROS **********************/ @@ -344,7 +337,7 @@ static void window_create(monitor_t * m) flag |= SDL_WINDOW_FULLSCREEN; #endif - m->window = SDL_CreateWindow("TFT Simulator", + m->window = SDL_CreateWindow(SDL_WINDOW_TITLE, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SDL_HOR_RES * SDL_ZOOM, SDL_VER_RES * SDL_ZOOM, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/ @@ -375,7 +368,7 @@ static void window_update(monitor_t * m) #endif SDL_RenderClear(m->renderer); lv_disp_t * d = _lv_refr_get_disp_refreshing(); - if(d->driver->screen_transp) { + if(d && d->driver->screen_transp) { SDL_SetRenderDrawColor(m->renderer, 0xff, 0, 0, 0xff); SDL_Rect r; r.x = 0; r.y = 0; r.w = SDL_HOR_RES; r.h = SDL_VER_RES; diff --git a/lib/lv_drivers/sdl/sdl_common.c b/lib/lv_drivers/sdl/sdl_common.c index 64f739d..1eae5b5 100644 --- a/lib/lv_drivers/sdl/sdl_common.c +++ b/lib/lv_drivers/sdl/sdl_common.c @@ -5,6 +5,8 @@ #include "sdl_common.h" #if USE_SDL || USE_SDL_GPU +#include "sdl_common_internal.h" + /********************* * DEFINES *********************/ @@ -130,17 +132,17 @@ void mouse_handler(SDL_Event * event) case SDL_FINGERUP: left_button_down = false; - last_x = LV_HOR_RES * event->tfinger.x / SDL_ZOOM; - last_y = LV_VER_RES * event->tfinger.y / SDL_ZOOM; + last_x = SDL_HOR_RES * event->tfinger.x / SDL_ZOOM; + last_y = SDL_VER_RES * event->tfinger.y / SDL_ZOOM; break; case SDL_FINGERDOWN: left_button_down = true; - last_x = LV_HOR_RES * event->tfinger.x / SDL_ZOOM; - last_y = LV_VER_RES * event->tfinger.y / SDL_ZOOM; + last_x = SDL_HOR_RES * event->tfinger.x / SDL_ZOOM; + last_y = SDL_VER_RES * event->tfinger.y / SDL_ZOOM; break; case SDL_FINGERMOTION: - last_x = LV_HOR_RES * event->tfinger.x / SDL_ZOOM; - last_y = LV_VER_RES * event->tfinger.y / SDL_ZOOM; + last_x = SDL_HOR_RES * event->tfinger.x / SDL_ZOOM; + last_y = SDL_VER_RES * event->tfinger.y / SDL_ZOOM; break; } diff --git a/lib/lv_drivers/sdl/sdl_common.h b/lib/lv_drivers/sdl/sdl_common.h index b2832c4..4556595 100644 --- a/lib/lv_drivers/sdl/sdl_common.h +++ b/lib/lv_drivers/sdl/sdl_common.h @@ -32,7 +32,6 @@ extern "C" { #ifndef SDL_INCLUDE_PATH #define SDL_INCLUDE_PATH MONITOR_SDL_INCLUDE_PATH #endif -#include SDL_INCLUDE_PATH #ifndef SDL_ZOOM #define SDL_ZOOM MONITOR_ZOOM @@ -85,16 +84,6 @@ void sdl_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); */ void sdl_keyboard_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); -int quit_filter(void * userdata, SDL_Event * event); - -void mouse_handler(SDL_Event * event); -void mousewheel_handler(SDL_Event * event); -uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key); -void keyboard_handler(SDL_Event * event); - -/********************** - * MACROS - **********************/ #endif /* USE_SDL || USE_SDL_GPU */ #ifdef __cplusplus diff --git a/lib/lv_drivers/sdl/sdl_common_internal.h b/lib/lv_drivers/sdl/sdl_common_internal.h new file mode 100644 index 0000000..0c5cce6 --- /dev/null +++ b/lib/lv_drivers/sdl/sdl_common_internal.h @@ -0,0 +1,39 @@ +/** + * @file sdl_common_internal.h + * Provides SDL related functions which are only used internal. + * + */ + +#ifndef SDL_COMMON_INTERNAL_H +#define SDL_COMMON_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "sdl_common.h" + +#if USE_SDL || USE_SDL_GPU + +#include SDL_INCLUDE_PATH + +/********************** + * GLOBAL PROTOTYPES + **********************/ +int quit_filter(void * userdata, SDL_Event * event); + +void mouse_handler(SDL_Event * event); +void mousewheel_handler(SDL_Event * event); +uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key); +void keyboard_handler(SDL_Event * event); + +#endif /* USE_SDL || USE_SDL_GPU */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SDL_COMMON_INTERNAL_H */ diff --git a/lib/lv_drivers/sdl/sdl_gpu.c b/lib/lv_drivers/sdl/sdl_gpu.c index 9794cc7..d372903 100644 --- a/lib/lv_drivers/sdl/sdl_gpu.c +++ b/lib/lv_drivers/sdl/sdl_gpu.c @@ -9,7 +9,7 @@ #include "sdl_gpu.h" #if USE_SDL_GPU -#if LV_USE_GPU_SDL == 0 +#if LV_USE_DRAW_SDL == 0 # error "LV_USE_DRAW_SDL must be enabled" #endif @@ -29,6 +29,7 @@ # error "Cannot enable both MONITOR and SDL at the same time. " #endif +#include "sdl_common_internal.h" #include #include #include @@ -90,14 +91,14 @@ void sdl_init(void) void sdl_disp_drv_init(lv_disp_drv_t * disp_drv, lv_coord_t hor_res, lv_coord_t ver_res) { - monitor_t *m = lv_mem_alloc(sizeof(monitor_t)); + monitor_t *m = lv_malloc(sizeof(monitor_t)); window_create(m); lv_disp_drv_init(disp_drv); disp_drv->direct_mode = 1; disp_drv->flush_cb = monitor_flush; disp_drv->hor_res = hor_res; disp_drv->ver_res = ver_res; - lv_disp_draw_buf_t *disp_buf = lv_mem_alloc(sizeof(lv_disp_draw_buf_t)); + lv_disp_draw_buf_t *disp_buf = lv_malloc(sizeof(lv_disp_draw_buf_t)); lv_disp_draw_buf_init(disp_buf, m->texture, NULL, hor_res * ver_res); disp_drv->draw_buf = disp_buf; disp_drv->antialiasing = 1; diff --git a/lib/lv_drivers/wayland/CMakeLists.txt b/lib/lv_drivers/wayland/CMakeLists.txt index 6ac6505..1d09e14 100644 --- a/lib/lv_drivers/wayland/CMakeLists.txt +++ b/lib/lv_drivers/wayland/CMakeLists.txt @@ -8,7 +8,7 @@ pkg_check_modules(xkbcommon REQUIRED xkbcommon) # Wayland protocols find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner) -pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols>=1.15) +pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols>=1.25) pkg_get_variable(WAYLAND_PROTOCOLS_BASE wayland-protocols pkgdatadir) macro(wayland_generate protocol_xml_file output_dir target) diff --git a/lib/lv_drivers/wayland/smm.c b/lib/lv_drivers/wayland/smm.c new file mode 100644 index 0000000..00ee012 --- /dev/null +++ b/lib/lv_drivers/wayland/smm.c @@ -0,0 +1,652 @@ +/** + * @file smm.c + * + */ +#if USE_WAYLAND + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "smm.h" + +#define MAX_NAME_ATTEMPTS (5) +#define PREFER_NUM_BUFFERS (3) + +#define ROUND_UP(n, b) (((((n) ? (n) : 1) + (b) - 1) / (b)) * (b)) +#define LLHEAD(type) \ +struct { \ + struct type *first; \ + struct type *last; \ +} + +#define LLLINK(type) \ +struct { \ + struct type *next; \ + struct type *prev; \ +} + +#define LL_FIRST(head) ((head)->first) +#define LL_LAST(head) ((head)->last) +#define LL_IS_EMPTY(head) (LL_FIRST(head) == NULL) +#define LL_NEXT(src, member) ((src)->member.next) +#define LL_PREV(src, member) ((src)->member.prev) + +#define LL_INIT(head) do { \ + (head)->first = NULL; \ + (head)->last = NULL; \ +} while (0) + +#define LL_ENQUEUE(head, src, member) do { \ + (src)->member.next = NULL; \ + (src)->member.prev = (head)->last; \ + if ((head)->last == NULL) { \ + (head)->first = (src); \ + } else { \ + (head)->last->member.next = (src); \ + } \ + (head)->last = (src); \ +} while (0) + +#define LL_DEQUEUE(entry, head, member) do { \ + (entry) = LL_FIRST(head); \ + LL_REMOVE(head, entry, member); \ +} while (0) + +#define LL_INSERT_AFTER(head, dest, src, member) do { \ + (src)->member.prev = (dest); \ + (src)->member.next = (dest)->member.next; \ + if ((dest)->member.next != NULL) { \ + (dest)->member.next->member.prev = (src); \ + } else { \ + (head)->last = (src); \ + } \ + (dest)->member.next = (src); \ +} while (0) + +#define LL_REMOVE(head, src, member) do { \ + if ((src)->member.prev != NULL) { \ + (src)->member.prev->member.next = (src)->member.next; \ + } else { \ + (head)->first = (src)->member.next; \ + } \ + if ((src)->member.next != NULL) { \ + (src)->member.next->member.prev = (src)->member.prev; \ + } else { \ + (head)->last = (src)->member.prev; \ + } \ +} while (0) + +#define LL_FOREACH(entry, head, member) \ + for ((entry) = LL_FIRST(head); \ + (entry) != NULL; \ + (entry) = LL_NEXT(entry, member)) + +struct smm_pool { + struct smm_pool_properties props; + LLHEAD(smm_buffer) allocd; + void *map; + size_t map_size; + bool map_outdated; +}; + +struct smm_buffer { + struct smm_buffer_properties props; + bool group_resized; + LLLINK(smm_buffer) pool; + LLLINK(smm_buffer) use; + LLLINK(smm_buffer) age; +}; + +struct smm_group { + struct smm_group_properties props; + size_t size; + unsigned char num_buffers; + LLHEAD(smm_buffer) unused; + LLHEAD(smm_buffer) inuse; + LLHEAD(smm_buffer) history; + LLLINK(smm_group) link; +}; + +static size_t calc_buffer_size(struct smm_buffer *buf); +static void purge_history(struct smm_buffer *buf); +static struct smm_buffer *get_from_pool(struct smm_group *grp); +static void return_to_pool(struct smm_buffer *buf); +static struct smm_pool *alloc_pool(void); +static void free_pool(struct smm_pool *pool); +static struct smm_buffer *alloc_buffer(struct smm_buffer *last, size_t offset); +static void free_buffer(struct smm_buffer *buf); + +static struct { + unsigned long page_sz; + struct smm_events cbs; + struct smm_pool *active; + LLHEAD(smm_group) groups; + struct { + size_t active_used; + } statistics; +} smm_instance; + + +void smm_init(struct smm_events *evs) +{ + memcpy(&smm_instance.cbs, evs, sizeof(struct smm_events)); + srand((unsigned int)clock()); + smm_instance.page_sz = (unsigned long)sysconf(_SC_PAGESIZE); + LL_INIT(&smm_instance.groups); +} + + +void smm_deinit(void) +{ + struct smm_group *grp; + + /* Destroy all buffer groups */ + while (!LL_IS_EMPTY(&smm_instance.groups)) { + LL_DEQUEUE(grp, &smm_instance.groups, link); + smm_destroy(grp); + } +} + + +void smm_setctx(void *ctx) +{ + smm_instance.cbs.ctx = ctx; +} + + +smm_group_t *smm_create(void) +{ + struct smm_group *grp; + + /* Allocate and intialize a new buffer group */ + grp = malloc(sizeof(struct smm_group)); + if (grp != NULL) { + grp->size = smm_instance.page_sz; + grp->num_buffers = 0; + LL_INIT(&grp->unused); + LL_INIT(&grp->inuse); + LL_INIT(&grp->history); + + /* Add to instance groups queue */ + LL_ENQUEUE(&smm_instance.groups, grp, link); + } + + return grp; +} + + +void smm_resize(smm_group_t *grp, size_t sz) +{ + struct smm_buffer *buf; + struct smm_group *rgrp = grp; + + /* Round allocation size up to a sysconf(_SC_PAGE_SIZE) boundary */ + rgrp->size = ROUND_UP(sz, smm_instance.page_sz); + + /* Return all unused buffers to pool (to be re-allocated at the new size) */ + while (!LL_IS_EMPTY(&rgrp->unused)) { + LL_DEQUEUE(buf, &rgrp->unused, use); + return_to_pool(buf); + } + + /* Mark all buffers in use to be freed to pool when possible */ + LL_FOREACH(buf, &rgrp->inuse, use) { + buf->group_resized = true; + purge_history(buf); + } +} + + +void smm_destroy(smm_group_t *grp) +{ + struct smm_buffer *buf; + struct smm_group *dgrp = grp; + + /* Return unused buffers */ + while (!LL_IS_EMPTY(&dgrp->unused)) { + LL_DEQUEUE(buf, &dgrp->unused, use); + return_to_pool(buf); + } + + /* Return buffers that are still in use (ideally this queue should be empty + * at this time) + */ + while (!LL_IS_EMPTY(&dgrp->inuse)) { + LL_DEQUEUE(buf, &dgrp->inuse, use); + return_to_pool(buf); + } + + /* Remove from instance groups queue */ + LL_REMOVE(&smm_instance.groups, dgrp, link); + free(dgrp); +} + + +smm_buffer_t *smm_acquire(smm_group_t *grp) +{ + struct smm_buffer *buf; + struct smm_group *agrp = grp; + + if (LL_IS_EMPTY(&agrp->unused)) { + /* No unused buffer available, so get a new one from pool */ + buf = get_from_pool(agrp); + } else { + /* Otherwise, reuse an unused buffer */ + LL_DEQUEUE(buf, &agrp->unused, use); + } + + if (buf != NULL) { + /* Add buffer to in-use queue */ + LL_ENQUEUE(&agrp->inuse, buf, use); + + /* Emit 'init buffer' event */ + if (smm_instance.cbs.init_buffer != NULL) { + if (smm_instance.cbs.init_buffer(smm_instance.cbs.ctx, &buf->props)) { + smm_release(buf); + buf = NULL; + } + } + + if (buf != NULL) { + /* Remove from history */ + purge_history(buf); + + /* Add to history a-new */ + LL_ENQUEUE(&agrp->history, buf, age); + } + } + + return buf; +} + + +void *smm_map(smm_buffer_t *buf) +{ + struct smm_buffer *mbuf = buf; + struct smm_pool *pool = mbuf->props.pool; + void *map = pool->map; + + if (pool->map_outdated) { + /* Update mapping to current pool size */ + if (pool->map != NULL) { + munmap(pool->map, pool->map_size); + } + + map = mmap(NULL, + pool->props.size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + pool->props.fd, + 0); + + if (map == MAP_FAILED) { + map = NULL; + pool->map = NULL; + } else { + pool->map = map; + pool->map_size = pool->props.size; + pool->map_outdated = false; + } + } + + /* Calculate buffer mapping (from offset in pool) */ + if (map != NULL) { + map = (((char *)map) + mbuf->props.offset); + } + + return map; +} + + +void smm_release(smm_buffer_t *buf) +{ + struct smm_buffer *rbuf = buf; + struct smm_group *grp = rbuf->props.group; + + /* Remove from in-use queue */ + LL_REMOVE(&grp->inuse, rbuf, use); + + if (rbuf->group_resized) { + /* Buffer group was resized while this buffer was in-use, thus it must be + * returned to it's pool + */ + rbuf->group_resized = false; + return_to_pool(rbuf); + } else { + /* Move to unused queue */ + LL_ENQUEUE(&grp->unused, rbuf, use); + + /* Try to limit total number of buffers to preferred number */ + while ((grp->num_buffers > PREFER_NUM_BUFFERS) && + (!LL_IS_EMPTY(&grp->unused))) { + LL_DEQUEUE(rbuf, &grp->unused, use); + return_to_pool(rbuf); + } + } +} + + +smm_buffer_t *smm_latest(smm_group_t *grp) +{ + struct smm_group *lgrp = grp; + + return LL_LAST(&lgrp->history); +} + + +smm_buffer_t *smm_next(smm_buffer_t *buf) +{ + struct smm_buffer *ibuf; + struct smm_buffer *nbuf = buf; + struct smm_group *grp = nbuf->props.group; + + LL_FOREACH(ibuf, &grp->history, age) { + if (ibuf == nbuf) { + ibuf = LL_NEXT(ibuf, age); + break; + } + } + + return ibuf; +} + +void purge_history(struct smm_buffer *buf) +{ + struct smm_buffer *ibuf; + struct smm_group *grp = buf->props.group; + + /* Remove from history (and any older) */ + LL_FOREACH(ibuf, &grp->history, age) { + if (ibuf == buf) { + do { + LL_DEQUEUE(ibuf, &grp->history, age); + } while (ibuf != buf); + break; + } + } +} + + +size_t calc_buffer_size(struct smm_buffer *buf) +{ + size_t buf_sz; + struct smm_pool *buf_pool = buf->props.pool; + + if (buf == LL_LAST(&buf_pool->allocd)) { + buf_sz = (buf_pool->props.size - buf->props.offset); + } else { + buf_sz = (LL_NEXT(buf, pool)->props.offset - buf->props.offset); + } + + return buf_sz; +} + + +struct smm_buffer *get_from_pool(struct smm_group *grp) +{ + int ret; + size_t buf_sz; + struct smm_buffer *buf; + struct smm_buffer *last = NULL; + + /* TODO: Determine when to allocate a new active pool (i.e. memory shrink) */ + + if (smm_instance.active == NULL) { + /* Allocate a new active pool */ + smm_instance.active = alloc_pool(); + smm_instance.statistics.active_used = 0; + } + + if (smm_instance.active == NULL) { + buf = NULL; + } else { + /* Search for a free buffer large enough for allocation */ + LL_FOREACH(buf, &smm_instance.active->allocd, pool) { + last = buf; + if (buf->props.group == NULL) { + buf_sz = calc_buffer_size(buf); + if (buf_sz == grp->size) { + break; + } else if (buf_sz > grp->size) { + if ((buf != LL_LAST(&smm_instance.active->allocd)) && + (LL_NEXT(buf, pool)->props.group == NULL)) { + /* Pull back next buffer to use unallocated size */ + LL_NEXT(buf, pool)->props.offset -= (buf_sz - grp->size); + } else { + /* Allocate another buffer to hold unallocated size */ + alloc_buffer(buf, buf->props.offset + grp->size); + } + + break; + } + } + } + + if (buf == NULL) { + /* No buffer found to meet allocation size, expand pool */ + if ((last != NULL) && + (last->props.group == NULL)) { + /* Use last free buffer */ + buf_sz = (grp->size - buf_sz); + } else { + /* Allocate new buffer */ + buf_sz = grp->size; + if (last == NULL) { + buf = alloc_buffer(NULL, 0); + } else { + buf = alloc_buffer(last, smm_instance.active->props.size); + } + last = buf; + } + + if (last != NULL) { + /* Expand pool backing memory */ + ret = ftruncate(smm_instance.active->props.fd, + smm_instance.active->props.size + buf_sz); + if (ret) { + if (buf != NULL) { + free_buffer(buf); + buf = NULL; + } + } else { + smm_instance.active->props.size += buf_sz; + smm_instance.active->map_outdated = true; + buf = last; + + if (!(smm_instance.active->props.size - buf_sz)) { + /* Emit 'new pool' event */ + if ((smm_instance.cbs.new_pool != NULL) && + (smm_instance.cbs.new_pool(smm_instance.cbs.ctx, + &smm_instance.active->props))) { + free_buffer(buf); + free_pool(smm_instance.active); + smm_instance.active = NULL; + buf = NULL; + } + } else { + /* Emit 'expand pool' event */ + if (smm_instance.cbs.expand_pool != NULL) { + smm_instance.cbs.expand_pool(smm_instance.cbs.ctx, + &smm_instance.active->props); + } + } + } + } + } + } + + if (buf != NULL) { + /* Set buffer group */ + memcpy((void *)&buf->props.group, &grp, sizeof(struct smm_group *)); + + /* Emit 'new buffer' event */ + if (smm_instance.cbs.new_buffer != NULL) { + if (smm_instance.cbs.new_buffer(smm_instance.cbs.ctx, &buf->props)) { + grp = NULL; + memcpy((void *)&buf->props.group, &grp, sizeof(struct smm_group *)); + buf = NULL; + } + } + + if (buf != NULL) { + /* Update active pool usage statistic */ + smm_instance.statistics.active_used += grp->size; + grp->num_buffers++; + } + } + + return buf; +} + + +void return_to_pool(struct smm_buffer *buf) +{ + struct smm_group *grp = buf->props.group; + struct smm_pool *pool = buf->props.pool; + + /* Emit 'free buffer' event */ + if (smm_instance.cbs.free_buffer != NULL) { + smm_instance.cbs.free_buffer(smm_instance.cbs.ctx, &buf->props); + } + + /* Buffer is no longer part of history */ + purge_history(buf); + + /* Buffer is no longer part of group */ + grp->num_buffers--; + grp = NULL; + memcpy((void *)&buf->props.group, &grp, sizeof(struct smm_group *)); + + /* Update active pool usage statistic */ + if (smm_instance.active == pool) { + smm_instance.statistics.active_used -= calc_buffer_size(buf); + } + + /* Coalesce with ungrouped buffers beside this one */ + if ((buf != LL_LAST(&pool->allocd)) && + (LL_NEXT(buf, pool)->props.group == NULL)) { + free_buffer(LL_NEXT(buf, pool)); + } + if ((buf != LL_FIRST(&pool->allocd)) && + (LL_PREV(buf, pool)->props.group == NULL)) { + buf = LL_PREV(buf, pool); + pool = buf->props.pool; + free_buffer(LL_NEXT(buf, pool)); + } + + /* Free buffer (and pool), if only remaining buffer in pool */ + if ((buf == LL_FIRST(&pool->allocd)) && + (buf == LL_LAST(&pool->allocd))) { + free_buffer(buf); + + /* Emit 'free pool' event */ + if (smm_instance.cbs.free_pool != NULL) { + smm_instance.cbs.free_pool(smm_instance.cbs.ctx, &pool->props); + } + + free_pool(pool); + if (smm_instance.active == pool) { + smm_instance.active = NULL; + } + } +} + + +struct smm_pool *alloc_pool(void) +{ + struct smm_pool *pool; + char name[] = ("/" SMM_FD_NAME "-XXXXX"); + unsigned char attempts = 0; + bool opened = false; + + pool = malloc(sizeof(struct smm_pool)); + if (pool != NULL) { + do { + /* A randomized pool name should help reduce collisions */ + sprintf(name + sizeof(SMM_FD_NAME) + 1, "%05X", rand() & 0xFFFF); + pool->props.fd = shm_open(name, + O_RDWR | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR); + if (pool->props.fd >= 0) { + shm_unlink(name); + pool->props.size = 0; + pool->map = NULL; + pool->map_size = 0; + pool->map_outdated = false; + LL_INIT(&pool->allocd); + opened = true; + break; + } else { + if (errno != EEXIST) { + break; + } + attempts++; + } + } while (attempts < MAX_NAME_ATTEMPTS); + + if (!opened) { + free(pool); + pool = NULL; + } + } + + return pool; +} + + +void free_pool(struct smm_pool *pool) +{ + if (pool->map != NULL) { + munmap(pool->map, pool->map_size); + } + + close(pool->props.fd); + free(pool); +} + + +struct smm_buffer *alloc_buffer(struct smm_buffer *last, size_t offset) +{ + struct smm_buffer *buf; + struct smm_buffer_properties initial_props = { + {NULL}, + NULL, + smm_instance.active, + offset + }; + + /* Allocate and intialize a new buffer (including linking in to pool) */ + buf = malloc(sizeof(struct smm_buffer)); + if (buf != NULL) { + memcpy(&buf->props, &initial_props, sizeof(struct smm_buffer_properties)); + buf->group_resized = false; + + if (last == NULL) { + LL_ENQUEUE(&smm_instance.active->allocd, buf, pool); + } else { + LL_INSERT_AFTER(&smm_instance.active->allocd, last, buf, pool); + } + } + + return buf; +} + + +void free_buffer(struct smm_buffer *buf) +{ + struct smm_pool *buf_pool = buf->props.pool; + + /* Remove from pool */ + LL_REMOVE(&buf_pool->allocd, buf, pool); + free(buf); +} + +#endif diff --git a/lib/lv_drivers/wayland/smm.h b/lib/lv_drivers/wayland/smm.h new file mode 100644 index 0000000..972936b --- /dev/null +++ b/lib/lv_drivers/wayland/smm.h @@ -0,0 +1,67 @@ +/** + * @file smm.h + * + */ +#ifndef SMM_H +#define SMM_H +#include +#include + +#define SMM_FD_NAME "lvgl-wayland" +#define SMM_POOL_TAGS (1) +#define SMM_BUFFER_TAGS (2) +#define SMM_GROUP_TAGS (1) + +#define SMM_POOL_PROPERTIES(p) ((const struct smm_pool_properties *)(p)) +#define SMM_BUFFER_PROPERTIES(b) ((const struct smm_buffer_properties *)(b)) +#define SMM_GROUP_PROPERTIES(g) ((const struct smm_group_properties *)(g)) +#define SMM_TAG(o, n, v) \ + do { \ + void **smm_tag = (void **)((char *)o + (n * sizeof(void *))); \ + *smm_tag = (v); \ + } while(0) + +typedef void smm_pool_t; +typedef void smm_buffer_t; +typedef void smm_group_t; + +struct smm_events { + void *ctx; + bool (*new_pool)(void *ctx, smm_pool_t *pool); + void (*expand_pool)(void *ctx, smm_pool_t *pool); + void (*free_pool)(void *ctx, smm_pool_t *pool); + bool (*new_buffer)(void *ctx, smm_buffer_t *buf); + bool (*init_buffer)(void *ctx, smm_buffer_t *buf); + void (*free_buffer)(void *ctx, smm_buffer_t *buf); +}; + +struct smm_pool_properties { + void *tag[SMM_POOL_TAGS]; + size_t size; + int fd; +}; + +struct smm_buffer_properties { + void *tag[SMM_BUFFER_TAGS]; + smm_group_t *const group; + smm_pool_t *const pool; + size_t offset; +}; + +struct smm_group_properties { + void *tag[SMM_GROUP_TAGS]; +}; + +void smm_init(struct smm_events *evs); +void smm_setctx(void *ctx); +void smm_deinit(void); +smm_group_t *smm_create(void); +void smm_resize(smm_group_t *grp, size_t sz); +void smm_destroy(smm_group_t *grp); +smm_buffer_t *smm_acquire(smm_group_t *grp); +void *smm_map(smm_buffer_t *buf); +void smm_release(smm_buffer_t *buf); +smm_buffer_t *smm_latest(smm_group_t *grp); +smm_buffer_t *smm_next(smm_buffer_t *buf); + +#endif diff --git a/lib/lv_drivers/wayland/wayland.c b/lib/lv_drivers/wayland/wayland.c index 11ed05c..e7840c2 100644 --- a/lib/lv_drivers/wayland/wayland.c +++ b/lib/lv_drivers/wayland/wayland.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ #include "wayland.h" +#include "smm.h" #if USE_WAYLAND @@ -41,6 +42,10 @@ *********************/ #define BYTES_PER_PIXEL ((LV_COLOR_DEPTH + 7) / 8) +#define LVGL_DRAW_BUFFER_DIV (8) +#define DMG_CACHE_CAPACITY (32) +#define TAG_LOCAL (0) +#define TAG_BUFFER_DAMAGE (1) #if LV_WAYLAND_CLIENT_SIDE_DECORATIONS #define TITLE_BAR_HEIGHT 24 @@ -51,7 +56,7 @@ #endif #ifndef LV_WAYLAND_CYCLE_PERIOD -#define LV_WAYLAND_CYCLE_PERIOD LV_MIN(LV_DISP_DEF_REFR_PERIOD,1) +#define LV_WAYLAND_CYCLE_PERIOD LV_MIN(LV_DEF_REFR_PERIOD,1) #endif /********************** @@ -59,7 +64,7 @@ **********************/ enum object_type { - OBJECT_TITLEBAR, + OBJECT_TITLEBAR = 0, OBJECT_BUTTON_CLOSE, #if LV_WAYLAND_XDG_SHELL OBJECT_BUTTON_MAXIMIZE, @@ -69,11 +74,11 @@ enum object_type { OBJECT_BORDER_BOTTOM, OBJECT_BORDER_LEFT, OBJECT_BORDER_RIGHT, - FIRST_DECORATION = OBJECT_TITLEBAR, - LAST_DECORATION = OBJECT_BORDER_RIGHT, OBJECT_WINDOW, }; +#define FIRST_DECORATION (OBJECT_TITLEBAR) +#define LAST_DECORATION (OBJECT_BORDER_RIGHT) #define NUM_DECORATIONS (LAST_DECORATION-FIRST_DECORATION+1) struct window; @@ -116,36 +121,20 @@ struct seat } xkb; }; -struct buffer_hdl -{ - void *base; - int size; - struct wl_buffer *wl_buffer; - bool busy; -}; - -struct buffer_allocator -{ - int shm_mem_fd; - int shm_mem_size; - int shm_file_free_size; - struct wl_shm_pool *shm_pool; -}; - struct graphic_object { struct window *window; struct wl_surface *surface; bool surface_configured; + smm_buffer_t *pending_buffer; + smm_group_t *buffer_group; struct wl_subsurface *subsurface; enum object_type type; int width; int height; - struct buffer_hdl buffer; - struct input input; }; @@ -220,11 +209,16 @@ struct window #if LV_WAYLAND_XDG_SHELL struct xdg_surface *xdg_surface; struct xdg_toplevel *xdg_toplevel; + uint32_t wm_capabilities; #endif - struct buffer_allocator allocator; - struct graphic_object * body; + struct { + lv_area_t cache[DMG_CACHE_CAPACITY]; + unsigned char start; + unsigned char end; + unsigned size; + } dmg_cache; #if LV_WAYLAND_CLIENT_SIDE_DECORATIONS struct graphic_object * decoration[NUM_DECORATIONS]; @@ -1085,13 +1079,17 @@ static const struct wl_shell_surface_listener shell_surface_listener = { static void xdg_surface_handle_configure(void *data, struct xdg_surface *xdg_surface, uint32_t serial) { struct window *window = (struct window *)data; - struct buffer_hdl *buffer = &window->body->buffer; + struct wl_buffer *wl_buf; xdg_surface_ack_configure(xdg_surface, serial); - if ((!window->body->surface_configured) && (buffer->busy)) { - // Flush occured before surface was configured, so add buffer here - wl_surface_attach(window->body->surface, buffer->wl_buffer, 0, 0); + if ((!window->body->surface_configured) && + (window->body->pending_buffer != NULL)) { + // LVGL flush occured before surface was configured, so attach pending buffer here + wl_buf = SMM_BUFFER_PROPERTIES(window->body->pending_buffer)->tag[TAG_LOCAL]; + window->body->pending_buffer = NULL; + + wl_surface_attach(window->body->surface, wl_buf, 0, 0); wl_surface_commit(window->body->surface); window->flush_pending = true; } @@ -1144,10 +1142,23 @@ static void xdg_toplevel_handle_configure_bounds(void *data, struct xdg_toplevel */ } +static void xdg_toplevel_handle_wm_capabilities(void *data, struct xdg_toplevel *xdg_toplevel, + struct wl_array *capabilities) +{ + uint32_t *cap; + struct window *window = (struct window *)data; + + wl_array_for_each(cap, capabilities) { + window->wm_capabilities |= (1 << (*cap)); + /* TODO: Disable appropriate graphics/capabilities as appropriate */ + } +} + static const struct xdg_toplevel_listener xdg_toplevel_listener = { .configure = xdg_toplevel_handle_configure, .close = xdg_toplevel_handle_close, - .configure_bounds = xdg_toplevel_handle_configure_bounds + .configure_bounds = xdg_toplevel_handle_configure_bounds, + .wm_capabilities = xdg_toplevel_handle_wm_capabilities }; static void xdg_wm_base_ping(void *data, struct xdg_wm_base *xdg_wm_base, uint32_t serial) @@ -1211,176 +1222,246 @@ static const struct wl_registry_listener registry_listener = { static void handle_wl_buffer_release(void *data, struct wl_buffer *wl_buffer) { - struct buffer_hdl *buffer_hdl = (struct buffer_hdl *)data; - buffer_hdl->busy = false; + smm_release((smm_buffer_t *)data); } static const struct wl_buffer_listener wl_buffer_listener = { .release = handle_wl_buffer_release, }; -static bool initialize_allocator(struct buffer_allocator *allocator, const char *dir) +static void cache_clear(struct window *window) { - static const char template[] = "/lvgl-wayland-XXXXXX"; - char *name; + window->dmg_cache.start = window->dmg_cache.end; + window->dmg_cache.size = 0; +} - // Create file for shared memory allocation - name = lv_mem_alloc(strlen(dir) + sizeof(template)); - LV_ASSERT_MSG(name, "cannot allocate memory for name"); - if (!name) +static void cache_purge(struct window *window, smm_buffer_t *buf) +{ + lv_area_t *next_dmg; + smm_buffer_t *next_buf = smm_next(buf); + + /* Remove all damage areas up until start of next buffers damage */ + if (next_buf == NULL) { - return false; + cache_clear(window); } - - strcpy(name, dir); - strcat(name, template); - - allocator->shm_mem_fd = mkstemp(name); - - unlink(name); - lv_mem_free(name); - - LV_ASSERT_MSG((allocator->shm_mem_fd >= 0), "cannot create tmpfile"); - if (allocator->shm_mem_fd < 0) + else { - return false; + next_dmg = SMM_BUFFER_PROPERTIES(next_buf)->tag[TAG_BUFFER_DAMAGE]; + while ((window->dmg_cache.cache + window->dmg_cache.start) != next_dmg) + { + window->dmg_cache.start++; + window->dmg_cache.start %= DMG_CACHE_CAPACITY; + window->dmg_cache.size--; + } } - - allocator->shm_mem_size = 0; - allocator->shm_file_free_size = 0; - - return true; } -static void deinitialize_allocator(struct buffer_allocator *allocator) +static void cache_add_area(struct window *window, smm_buffer_t *buf, const lv_area_t *area) { - if (allocator->shm_pool) + if (SMM_BUFFER_PROPERTIES(buf)->tag[TAG_BUFFER_DAMAGE] == NULL) { - wl_shm_pool_destroy(allocator->shm_pool); + /* Buffer damage beyond cache capacity */ + goto done; } - if (allocator->shm_mem_fd >= 0) + if ((window->dmg_cache.start == window->dmg_cache.end) && + (window->dmg_cache.size)) { - close(allocator->shm_mem_fd); - allocator->shm_mem_fd = -1; + /* This buffer has more damage then the cache's capacity, so + * clear cache and leave buffer damage unrecorded + */ + cache_clear(window); + SMM_TAG(buf, TAG_BUFFER_DAMAGE, NULL); + goto done; } -} -static bool initialize_buffer(struct window *window, struct buffer_hdl *buffer_hdl, - int width, int height) -{ - struct application *app = window->application; - struct buffer_allocator *allocator = &window->allocator; - int allocated_size = 0; - int ret; - long sz = sysconf(_SC_PAGESIZE); + /* Add damage area to cache */ + memcpy(window->dmg_cache.cache + window->dmg_cache.end, + area, + sizeof(lv_area_t)); + window->dmg_cache.end++; + window->dmg_cache.end %= DMG_CACHE_CAPACITY; + window->dmg_cache.size++; - buffer_hdl->size = (((width * height * BYTES_PER_PIXEL) + sz - 1) / sz) * sz; +done: + return; +} - LV_LOG_TRACE("initializing buffer %dx%d (alloc size: %d)", - width, height, buffer_hdl->size); +static void cache_apply_areas(struct window *window, void *dest, void *src, smm_buffer_t *src_buf) +{ + unsigned long offset; + unsigned char start; + lv_coord_t y; + lv_area_t *dmg; + lv_area_t *next_dmg; + smm_buffer_t *next_buf = smm_next(src_buf); + const struct smm_buffer_properties *props = SMM_BUFFER_PROPERTIES(src_buf); + struct graphic_object *obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; - if (allocator->shm_file_free_size < buffer_hdl->size) + if (next_buf == NULL) { - do - { - ret = ftruncate(allocator->shm_mem_fd, - allocator->shm_mem_size + (buffer_hdl->size - allocator->shm_file_free_size)); - } - while ((ret < 0) && (errno == EINTR)); - - if (ret < 0) - { - LV_LOG_ERROR("ftruncate failed: %s", strerror(errno)); - goto err_out; - } - else - { - allocated_size = (buffer_hdl->size - allocator->shm_file_free_size); - } - - LV_ASSERT_MSG((allocated_size >= 0), "allocated_size is negative"); + next_dmg = (window->dmg_cache.cache + window->dmg_cache.end); } - - buffer_hdl->base = mmap(NULL, buffer_hdl->size, - PROT_READ | PROT_WRITE, MAP_SHARED, - allocator->shm_mem_fd, - allocator->shm_mem_size - allocator->shm_file_free_size); - if (buffer_hdl->base == MAP_FAILED) + else { - LV_LOG_ERROR("mmap failed: %s", strerror(errno)); - goto err_inc_free; + next_dmg = SMM_BUFFER_PROPERTIES(next_buf)->tag[TAG_BUFFER_DAMAGE]; } - if (!allocator->shm_pool) + /* Apply all buffer damage areas */ + start = ((lv_area_t *)SMM_BUFFER_PROPERTIES(src_buf)->tag[TAG_BUFFER_DAMAGE] - window->dmg_cache.cache); + while ((window->dmg_cache.cache + start) != next_dmg) { - // Create SHM pool - allocator->shm_pool = wl_shm_create_pool(app->shm, - allocator->shm_mem_fd, - allocator->shm_mem_size + allocated_size); - if (!allocator->shm_pool) + /* Copy an area from source to destination (line-by-line) */ + dmg = (window->dmg_cache.cache + start); + for (y = dmg->y1; y <= dmg->y2; y++) { - LV_LOG_ERROR("cannot create shm pool"); - goto err_unmap; + offset = (dmg->x1 + (y * (obj->width * BYTES_PER_PIXEL))); + memcpy(((char *)dest) + offset, + ((char *)src) + offset, + ((dmg->x2 - dmg->x1 + 1) * BYTES_PER_PIXEL)); } - } - else if (allocated_size > 0) - { - // Resize SHM pool - wl_shm_pool_resize(allocator->shm_pool, - allocator->shm_mem_size + allocated_size); - } - // Create buffer - buffer_hdl->wl_buffer = wl_shm_pool_create_buffer(allocator->shm_pool, - allocator->shm_mem_size - allocator->shm_file_free_size, - width, height, - width * BYTES_PER_PIXEL, - app->format); - if (!buffer_hdl->wl_buffer) - { - LV_LOG_ERROR("cannot create shm buffer"); - goto err_unmap; + start++; + start %= DMG_CACHE_CAPACITY; } - wl_buffer_add_listener(buffer_hdl->wl_buffer, &wl_buffer_listener, buffer_hdl); +} - /* Update size of SHM */ - allocator->shm_mem_size += allocated_size; - allocator->shm_file_free_size = LV_MAX(0, (allocator->shm_file_free_size - buffer_hdl->size)); +static bool sme_new_pool(void *ctx, smm_pool_t *pool) +{ + struct wl_shm_pool *wl_pool; + struct application *app = ctx; + const struct smm_pool_properties *props = SMM_POOL_PROPERTIES(pool); - lv_memset_00(buffer_hdl->base, buffer_hdl->size); + wl_pool = wl_shm_create_pool(app->shm, + props->fd, + props->size); - return true; + SMM_TAG(pool, TAG_LOCAL, wl_pool); + return (wl_pool == NULL); +} + +static void sme_expand_pool(void *ctx, smm_pool_t *pool) +{ + const struct smm_pool_properties *props = SMM_POOL_PROPERTIES(pool); -err_unmap: - munmap(buffer_hdl->base, buffer_hdl->size); + wl_shm_pool_resize(props->tag[TAG_LOCAL], props->size); +} -err_inc_free: - allocator->shm_file_free_size += allocated_size; +static void sme_free_pool(void *ctx, smm_pool_t *pool) +{ + struct wl_shm_pool *wl_pool = SMM_POOL_PROPERTIES(pool)->tag[TAG_LOCAL]; + wl_shm_pool_destroy(wl_pool); +} -err_out: - return false; +static bool sme_new_buffer(void *ctx, smm_buffer_t *buf) +{ + struct wl_buffer *wl_buf; + bool fail_alloc = true; + const struct smm_buffer_properties *props = SMM_BUFFER_PROPERTIES(buf); + struct wl_shm_pool *wl_pool = SMM_POOL_PROPERTIES(props->pool)->tag[TAG_LOCAL]; + struct application *app = ctx; + struct graphic_object *obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; + + wl_buf = wl_shm_pool_create_buffer(wl_pool, + props->offset, + obj->width, + obj->height, + obj->width * BYTES_PER_PIXEL, + app->format); + + if (wl_buf != NULL) { + wl_buffer_add_listener(wl_buf, &wl_buffer_listener, buf); + SMM_TAG(buf, TAG_LOCAL, wl_buf); + SMM_TAG(buf, TAG_BUFFER_DAMAGE, NULL); + fail_alloc = false; + } + + return fail_alloc; } -static bool deinitialize_buffer(struct window *window, struct buffer_hdl *buffer_hdl) +static bool sme_init_buffer(void *ctx, smm_buffer_t *buf) { - struct buffer_allocator *allocator = &window->allocator; + smm_buffer_t *src; + void *src_base; + bool fail_init = true; + bool dmg_missing = false; + void *buf_base = smm_map(buf); + const struct smm_buffer_properties *props = SMM_BUFFER_PROPERTIES(buf); + struct graphic_object *obj = SMM_GROUP_PROPERTIES(props->group)->tag[TAG_LOCAL]; - if (buffer_hdl->wl_buffer) + if (buf_base == NULL) { - wl_buffer_destroy(buffer_hdl->wl_buffer); - buffer_hdl->wl_buffer = NULL; + LV_LOG_ERROR("cannot map in buffer to initialize"); + goto done; } - if (buffer_hdl->size > 0) + /* Determine if all subsequent buffers damage is recorded */ + for (src = smm_next(buf); src != NULL; src = smm_next(src)) { - munmap(buffer_hdl->base, buffer_hdl->size); - allocator->shm_file_free_size += buffer_hdl->size; - buffer_hdl->base = 0; - buffer_hdl->size = 0; + if (SMM_BUFFER_PROPERTIES(src)->tag[TAG_BUFFER_DAMAGE] == NULL) + { + dmg_missing = true; + break; + } } - return true; + if ((smm_next(buf) == NULL) || dmg_missing) + { + /* Missing subsequent buffer damage, initialize by copying the most + * recently acquired buffers data + */ + src = smm_latest(props->group); + if ((src != NULL) && + (src != buf)) + { + /* Map and copy latest buffer data */ + src_base = smm_map(src); + if (src_base == NULL) + { + LV_LOG_ERROR("cannot map most recent buffer to copy"); + goto done; + } + + memcpy(buf_base, + src_base, + (obj->width * BYTES_PER_PIXEL) * obj->height); + } + } + else + { + /* All subsequent buffers damage is recorded, initialize by applying + * their damage to this buffer + */ + for (src = smm_next(buf); src != NULL; src = smm_next(src)) + { + src_base = smm_map(src); + if (src_base == NULL) + { + LV_LOG_ERROR("cannot map source buffer to copy from"); + goto done; + } + + cache_apply_areas(obj->window, buf_base, src_base, src); + } + + /* Purge out-of-date cached damage (up to and including next buffer) */ + src = smm_next(buf); + if (src == NULL) + { + cache_purge(obj->window, src); + } + } + + fail_init = false; +done: + return fail_init; +} + +static void sme_free_buffer(void *ctx, smm_buffer_t *buf) +{ + struct wl_buffer *wl_buf = SMM_BUFFER_PROPERTIES(buf)->tag[TAG_LOCAL]; + wl_buffer_destroy(wl_buf); } static struct graphic_object * create_graphic_obj(struct application *app, struct window *window, @@ -1389,27 +1470,35 @@ static struct graphic_object * create_graphic_obj(struct application *app, struc { struct graphic_object *obj; - obj = lv_mem_alloc(sizeof(*obj)); + obj = lv_malloc(sizeof(*obj)); LV_ASSERT_MALLOC(obj); if (!obj) { - return NULL; + goto err_out; } lv_memset(obj, 0x00, sizeof(struct graphic_object)); - obj->window = window; - obj->type = type; - obj->surface = wl_compositor_create_surface(app->compositor); if (!obj->surface) { LV_LOG_ERROR("cannot create surface for graphic object"); - goto err_out; + goto err_free; + } + + obj->buffer_group = smm_create(); + if (obj->buffer_group == NULL) + { + LV_LOG_ERROR("cannot create buffer group for graphic object"); + goto err_destroy_surface; } + obj->window = window; + obj->type = type; obj->surface_configured = true; + obj->pending_buffer = NULL; wl_surface_set_user_data(obj->surface, obj); + SMM_TAG(obj->buffer_group, TAG_LOCAL, obj); return obj; @@ -1417,7 +1506,7 @@ err_destroy_surface: wl_surface_destroy(obj->surface); err_free: - lv_mem_free(obj); + lv_free(obj); err_out: return NULL; @@ -1431,16 +1520,90 @@ static void destroy_graphic_obj(struct graphic_object * obj) } wl_surface_destroy(obj->surface); - - lv_mem_free(obj); + smm_destroy(obj->buffer_group); + lv_free(obj); } #if LV_WAYLAND_CLIENT_SIDE_DECORATIONS +static bool attach_decoration(struct window *window, struct graphic_object * decoration, + smm_buffer_t *decoration_buffer, struct graphic_object * parent) +{ + struct wl_buffer *wl_buf = SMM_BUFFER_PROPERTIES(decoration_buffer)->tag[TAG_LOCAL]; + + int pos_x, pos_y; + int x, y; + + switch (decoration->type) + { + case OBJECT_TITLEBAR: + pos_x = 0; + pos_y = -TITLE_BAR_HEIGHT; + break; + case OBJECT_BUTTON_CLOSE: + pos_x = parent->width - 1 * (BUTTON_MARGIN + BUTTON_SIZE); + pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); + break; +#if LV_WAYLAND_XDG_SHELL + case OBJECT_BUTTON_MAXIMIZE: + pos_x = parent->width - 2 * (BUTTON_MARGIN + BUTTON_SIZE); + pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); + break; + case OBJECT_BUTTON_MINIMIZE: + pos_x = parent->width - 3 * (BUTTON_MARGIN + BUTTON_SIZE); + pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); + break; +#endif + case OBJECT_BORDER_TOP: + pos_x = -BORDER_SIZE; + pos_y = -(BORDER_SIZE + TITLE_BAR_HEIGHT); + break; + case OBJECT_BORDER_BOTTOM: + pos_x = -BORDER_SIZE; + pos_y = parent->height; + break; + case OBJECT_BORDER_LEFT: + pos_x = -BORDER_SIZE; + pos_y = -TITLE_BAR_HEIGHT; + break; + case OBJECT_BORDER_RIGHT: + pos_x = parent->width; + pos_y = -TITLE_BAR_HEIGHT; + break; + default: + LV_ASSERT_MSG(0, "Invalid object type"); + return false; + } + + decoration->subsurface = wl_subcompositor_get_subsurface(window->application->subcompositor, + decoration->surface, + parent->surface); + if (!decoration->subsurface) + { + LV_LOG_ERROR("cannot get subsurface for decoration"); + goto err_destroy_surface; + } + + wl_subsurface_set_desync(decoration->subsurface); + wl_subsurface_set_position(decoration->subsurface, pos_x, pos_y); + + wl_surface_attach(decoration->surface, wl_buf, 0, 0); + wl_surface_commit(decoration->surface); + + return true; + +err_destroy_surface: + wl_surface_destroy(decoration->surface); + decoration->surface = NULL; + + return false; +} + static bool create_decoration(struct window *window, struct graphic_object * decoration, int window_width, int window_height) { - struct buffer_hdl * buffer = &decoration->buffer; + smm_buffer_t *buf; + void *buf_base; int x, y; switch (decoration->type) @@ -1484,26 +1647,38 @@ static bool create_decoration(struct window *window, return false; } - if (!initialize_buffer(window, buffer, decoration->width, decoration->height)) + smm_resize(decoration->buffer_group, + (decoration->width * BYTES_PER_PIXEL) * decoration->height); + + buf = smm_acquire(decoration->buffer_group); + if (buf == NULL) + { + LV_LOG_ERROR("cannot allocate buffer for decoration"); + return false; + } + + buf_base = smm_map(buf); + if (buf_base == NULL) { - LV_LOG_ERROR("cannot create buffer for decoration"); + LV_LOG_ERROR("cannot map in allocated decoration buffer"); + smm_release(buf); return false; } switch (decoration->type) { case OBJECT_TITLEBAR: - lv_color_fill((lv_color_t *)buffer->base, + lv_color_fill((lv_color_t *)buf_base, lv_color_make(0x66, 0x66, 0x66), (decoration->width * decoration->height)); break; case OBJECT_BUTTON_CLOSE: - lv_color_fill((lv_color_t *)buffer->base, + lv_color_fill((lv_color_t *)buf_base, lv_color_make(0xCC, 0xCC, 0xCC), (decoration->width * decoration->height)); for (y = 0; y < decoration->height; y++) { for (x = 0; x < decoration->width; x++) { - lv_color_t *pixel = ((lv_color_t *)buffer->base + (y * decoration->width) + x); + lv_color_t *pixel = ((lv_color_t *)buf_base + (y * decoration->width) + x); if ((x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING)) { if ((x == y) || (x == decoration->width - 1 - y)) @@ -1520,13 +1695,13 @@ static bool create_decoration(struct window *window, break; #if LV_WAYLAND_XDG_SHELL case OBJECT_BUTTON_MAXIMIZE: - lv_color_fill((lv_color_t *)buffer->base, + lv_color_fill((lv_color_t *)buf_base, lv_color_make(0xCC, 0xCC, 0xCC), (decoration->width * decoration->height)); for (y = 0; y < decoration->height; y++) { for (x = 0; x < decoration->width; x++) { - lv_color_t *pixel = ((lv_color_t *)buffer->base + (y * decoration->width) + x); + lv_color_t *pixel = ((lv_color_t *)buf_base + (y * decoration->width) + x); if (((x == BUTTON_PADDING) && (y >= BUTTON_PADDING) && (y < decoration->height - BUTTON_PADDING)) || ((x == (decoration->width - BUTTON_PADDING)) && (y >= BUTTON_PADDING) && (y <= decoration->height - BUTTON_PADDING)) || ((y == BUTTON_PADDING) && (x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING)) || @@ -1539,13 +1714,13 @@ static bool create_decoration(struct window *window, } break; case OBJECT_BUTTON_MINIMIZE: - lv_color_fill((lv_color_t *)buffer->base, + lv_color_fill((lv_color_t *)buf_base, lv_color_make(0xCC, 0xCC, 0xCC), (decoration->width * decoration->height)); for (y = 0; y < decoration->height; y++) { for (x = 0; x < decoration->width; x++) { - lv_color_t *pixel = ((lv_color_t *)buffer->base + (y * decoration->width) + x); + lv_color_t *pixel = ((lv_color_t *)buf_base + (y * decoration->width) + x); if ((x >= BUTTON_PADDING) && (x < decoration->width - BUTTON_PADDING) && (y > decoration->height - (2 * BUTTON_PADDING)) && (y < decoration->height - BUTTON_PADDING)) { @@ -1562,7 +1737,7 @@ static bool create_decoration(struct window *window, case OBJECT_BORDER_LEFT: /* fallthrough */ case OBJECT_BORDER_RIGHT: - lv_color_fill((lv_color_t *)buffer->base, + lv_color_fill((lv_color_t *)buf_base, lv_color_make(0x66, 0x66, 0x66), (decoration->width * decoration->height)); break; default: @@ -1570,80 +1745,7 @@ static bool create_decoration(struct window *window, return false; } - return true; -} - -static bool attach_decoration(struct window *window, struct graphic_object * decoration, - struct graphic_object * parent) -{ - struct buffer_hdl * buffer = &decoration->buffer; - int pos_x, pos_y; - int x, y; - - switch (decoration->type) - { - case OBJECT_TITLEBAR: - pos_x = 0; - pos_y = -TITLE_BAR_HEIGHT; - break; - case OBJECT_BUTTON_CLOSE: - pos_x = parent->width - 1 * (BUTTON_MARGIN + BUTTON_SIZE); - pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); - break; -#if LV_WAYLAND_XDG_SHELL - case OBJECT_BUTTON_MAXIMIZE: - pos_x = parent->width - 2 * (BUTTON_MARGIN + BUTTON_SIZE); - pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); - break; - case OBJECT_BUTTON_MINIMIZE: - pos_x = parent->width - 3 * (BUTTON_MARGIN + BUTTON_SIZE); - pos_y = -1 * (BUTTON_MARGIN + BUTTON_SIZE + (BORDER_SIZE / 2)); - break; -#endif - case OBJECT_BORDER_TOP: - pos_x = -BORDER_SIZE; - pos_y = -(BORDER_SIZE + TITLE_BAR_HEIGHT); - break; - case OBJECT_BORDER_BOTTOM: - pos_x = -BORDER_SIZE; - pos_y = parent->height; - break; - case OBJECT_BORDER_LEFT: - pos_x = -BORDER_SIZE; - pos_y = -TITLE_BAR_HEIGHT; - break; - case OBJECT_BORDER_RIGHT: - pos_x = parent->width; - pos_y = -TITLE_BAR_HEIGHT; - break; - default: - LV_ASSERT_MSG(0, "Invalid object type"); - return false; - } - - decoration->subsurface = wl_subcompositor_get_subsurface(window->application->subcompositor, - decoration->surface, - parent->surface); - if (!decoration->subsurface) - { - LV_LOG_ERROR("cannot get subsurface for decoration"); - goto err_destroy_surface; - } - - wl_subsurface_set_desync(decoration->subsurface); - wl_subsurface_set_position(decoration->subsurface, pos_x, pos_y); - - wl_surface_attach(decoration->surface, buffer->wl_buffer, 0, 0); - wl_surface_commit(decoration->surface); - buffer->busy = true; - - return true; - -err_destroy_surface: - wl_surface_destroy(decoration->surface); - decoration->surface = NULL; - - return false; + return attach_decoration(window, decoration, buf, window->body); } static void detach_decoration(struct window *window, @@ -1659,25 +1761,10 @@ static void detach_decoration(struct window *window, static bool resize_window(struct window *window, int width, int height) { - struct buffer_hdl *buffer = &window->body->buffer; + lv_color_t * buf1 = NULL; LV_LOG_TRACE("resize window %dx%d", width, height); - // De-initialize previous buffers - if (buffer->busy) - { - LV_LOG_WARN("Deinitializing busy window buffer..."); - wl_surface_attach(window->body->surface, NULL, 0, 0); - wl_surface_commit(window->body->surface); - buffer->busy = false; - } - - if (!deinitialize_buffer(window, buffer)) - { - LV_LOG_ERROR("failed to deinitialize window buffer"); - return false; - } - #if LV_WAYLAND_CLIENT_SIDE_DECORATIONS int b; for (b = 0; b < NUM_DECORATIONS; b++) @@ -1685,17 +1772,12 @@ static bool resize_window(struct window *window, int width, int height) if (window->decoration[b] != NULL) { detach_decoration(window, window->decoration[b]); - deinitialize_buffer(window, &window->decoration[b]->buffer); } } #endif - // Initialize backing buffer - if (!initialize_buffer(window, buffer, width, height)) - { - LV_LOG_ERROR("failed to initialize window buffer"); - return false; - } + /* Update size for newly allocated buffers */ + smm_resize(window->body->buffer_group, (width * BYTES_PER_PIXEL) * height); window->width = width; window->height = height; @@ -1713,17 +1795,24 @@ static bool resize_window(struct window *window, int width, int height) { LV_LOG_ERROR("failed to create decoration %d", b); } - else if (!attach_decoration(window, window->decoration[b], window->body)) - { - LV_LOG_ERROR("failed to attach decoration %d", b); - } } } #endif if (window->lv_disp != NULL) { - // Propagate resize to upper layers + /* Resize draw buffer */ + buf1 = lv_malloc(((width * height) / LVGL_DRAW_BUFFER_DIV) * sizeof(lv_color_t)); + if (!buf1) + { + LV_LOG_ERROR("failed to resize draw buffer"); + return false; + } + + lv_free(window->lv_disp_draw_buf.buf1); + lv_disp_draw_buf_init(&window->lv_disp_draw_buf, buf1, NULL, (width * height) / LVGL_DRAW_BUFFER_DIV); + + /* Propagate resize to LVGL */ window->lv_disp_drv.hor_res = width; window->lv_disp_drv.ver_res = height; lv_disp_drv_update(window->lv_disp, &window->lv_disp_drv); @@ -1750,19 +1839,12 @@ static struct window *create_window(struct application *app, int width, int heig window->application = app; - // Initialize buffer allocator - if (!initialize_allocator(&window->allocator, app->xdg_runtime_dir)) - { - LV_LOG_ERROR("cannot init memory allocator"); - goto err_free_window; - } - // Create wayland buffer and surface window->body = create_graphic_obj(app, window, OBJECT_WINDOW, NULL); if (!window->body) { LV_LOG_ERROR("cannot create window body"); - goto err_deinit_allocator; + goto err_free_window; } // Create shell surface @@ -1869,12 +1951,9 @@ err_destroy_shell_surface: err_destroy_surface: wl_surface_destroy(window->body->surface); -err_deinit_allocator: - deinitialize_allocator(&window->allocator); - err_free_window: _lv_ll_remove(&app->window_ll, window); - lv_mem_free(window); + lv_free(window); return NULL; } @@ -1905,98 +1984,125 @@ static void destroy_window(struct window *window) { if (window->decoration[b]) { - deinitialize_buffer(window, &window->decoration[b]->buffer); destroy_graphic_obj(window->decoration[b]); window->decoration[b] = NULL; } } #endif - deinitialize_buffer(window, &window->body->buffer); destroy_graphic_obj(window->body); - - deinitialize_allocator(&window->allocator); } static void _lv_wayland_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { + unsigned long offset; + int32_t x; + int32_t y; + void *buf_base; + struct wl_buffer *wl_buf; + lv_coord_t src_width = (area->x2 - area->x1 + 1); + lv_coord_t src_height = (area->y2 - area->y1 + 1); struct window *window = disp_drv->user_data; - struct buffer_hdl *buffer = &window->body->buffer; + smm_buffer_t *buf = window->body->pending_buffer; const lv_coord_t hres = (disp_drv->rotated == 0) ? (disp_drv->hor_res) : (disp_drv->ver_res); const lv_coord_t vres = (disp_drv->rotated == 0) ? (disp_drv->ver_res) : (disp_drv->hor_res); - /* If private data is not set, it means window has not been initialized */ - if (!window) + /* If window has been / is being closed, or is not visible, skip flush */ + if (window->closed || window->shall_close) { - LV_LOG_ERROR("please intialize wayland display using lv_wayland_create_window()"); - return; + goto skip; } - /* If window has been / is being closed, or is not visible, skip rendering */ - else if (window->closed || window->shall_close) - { - lv_disp_flush_ready(disp_drv); - return; - } - /* Return if the area is out the screen */ + /* Skip if the area is out the screen */ else if ((area->x2 < 0) || (area->y2 < 0) || (area->x1 > hres - 1) || (area->y1 > vres - 1)) { - lv_disp_flush_ready(disp_drv); - return; + goto skip; } else if (window->resize_pending) { LV_LOG_TRACE("skip flush since resize is pending"); - lv_disp_flush_ready(disp_drv); - return; + goto skip; } - else if (buffer->busy) + + /* Acquire and map a buffer to attach/commit to surface */ + if (buf == NULL) { - LV_LOG_WARN("skip flush since wayland backing buffer is busy"); - lv_disp_flush_ready(disp_drv); - return; + buf = smm_acquire(window->body->buffer_group); + if (buf == NULL) + { + LV_LOG_ERROR("cannot acquire a window body buffer"); + goto skip; + } + + window->body->pending_buffer = buf; + SMM_TAG(buf, + TAG_BUFFER_DAMAGE, + window->dmg_cache.cache + window->dmg_cache.end); } - int32_t x; - int32_t y; + buf_base = smm_map(buf); + if (buf_base == NULL) + { + LV_LOG_ERROR("cannot map in window body buffer"); + goto skip; + } - for (y = area->y1; y <= area->y2 && y < disp_drv->ver_res; y++) + /* Modify specified area in buffer */ + for (y = area->y1; y <= area->y2; y++) { - for (x = area->x1; x <= area->x2 && x < disp_drv->hor_res; x++) + offset = ((area->x1 + (y * disp_drv->hor_res)) * BYTES_PER_PIXEL); +#if (LV_COLOR_DEPTH == 1) + for (x = 0; x < src_width; x++) { - int offset = (y * disp_drv->hor_res) + x; -#if (LV_COLOR_DEPTH == 32) - uint32_t * const buf = (uint32_t *)buffer->base + offset; - *buf = color_p->full; -#elif (LV_COLOR_DEPTH == 16) - uint16_t * const buf = (uint16_t *)buffer->base + offset; - *buf = color_p->full; -#elif (LV_COLOR_DEPTH == 8) - uint8_t * const buf = (uint8_t *)buffer->base + offset; - *buf = color_p->full; -#elif (LV_COLOR_DEPTH == 1) - uint8_t * const buf = (uint8_t *)buffer->base + offset; - *buf = ((0x07 * color_p->ch.red) << 5) | - ((0x07 * color_p->ch.green) << 2) | - ((0x03 * color_p->ch.blue) << 0); -#endif + uint8_t * const dest = (uint8_t *)buf_base + offset + x; + *dest = ((0x07 * color_p->ch.red) << 5) | + ((0x07 * color_p->ch.green) << 2) | + ((0x03 * color_p->ch.blue) << 0); color_p++; } +#else + memcpy(((char *)buf_base) + offset, + color_p, + src_width * BYTES_PER_PIXEL); + color_p += src_width; +#endif } - wl_surface_damage(window->body->surface, area->x1, area->y1, - (area->x2 - area->x1 + 1), (area->y2 - area->y1 + 1)); + /* Mark surface damage */ + wl_surface_damage(window->body->surface, + area->x1, + area->y1, + src_width, + src_height); + + /* Cache buffer damage for future buffer initializations */ + cache_add_area(window, buf, area); if (lv_disp_flush_is_last(disp_drv)) { if (window->body->surface_configured) { - wl_surface_attach(window->body->surface, buffer->wl_buffer, 0, 0); - wl_surface_commit(window->body->surface); + /* Finally, attach buffer and commit to surface */ + wl_buf = SMM_BUFFER_PROPERTIES(buf)->tag[TAG_LOCAL]; + wl_surface_attach(window->body->surface, wl_buf, 0, 0); + wl_surface_commit(window->body->surface); + window->body->pending_buffer = NULL; } - buffer->busy = true; + window->flush_pending = true; } + goto done; +skip: + if (buf != NULL) { + /* Cleanup any intermediate state (in the event that this flush being + * skipped is in the middle of a flush sequence) + */ + cache_clear(window); + SMM_TAG(buf, TAG_BUFFER_DAMAGE, NULL); + smm_release(buf); + window->body->pending_buffer = NULL; + } +done: lv_disp_flush_ready(disp_drv); } @@ -2029,7 +2135,6 @@ static void _lv_wayland_handle_output(void) } else if (window->shall_close) { - destroy_window(window); window->closed = true; window->shall_close = false; shall_flush = true; @@ -2059,25 +2164,11 @@ static void _lv_wayland_handle_output(void) { window->application->keyboard_obj = NULL; } + destroy_window(window); } else if (window->resize_pending) { - bool do_resize = !window->body->buffer.busy; -#if LV_WAYLAND_CLIENT_SIDE_DECORATIONS - if (!window->application->opt_disable_decorations && !window->fullscreen) - { - int d; - for (d = 0; d < NUM_DECORATIONS; d++) - { - if ((window->decoration[d] != NULL) && (window->decoration[d]->buffer.busy)) - { - do_resize = false; - break; - } - } - } -#endif - if (do_resize && resize_window(window, window->resize_width, window->resize_height)) + if (resize_window(window, window->resize_width, window->resize_height)) { window->resize_width = window->width; window->resize_height = window->height; @@ -2178,6 +2269,16 @@ static void _lv_wayland_touch_read(lv_indev_drv_t *drv, lv_indev_data_t *data) */ void lv_wayland_init(void) { + struct smm_events evs = { + NULL, + sme_new_pool, + sme_expand_pool, + sme_free_pool, + sme_new_buffer, + sme_init_buffer, + sme_free_buffer + }; + application.xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"); LV_ASSERT_MSG(application.xdg_runtime_dir, "cannot get XDG_RUNTIME_DIR"); @@ -2222,6 +2323,9 @@ void lv_wayland_init(void) return; } + smm_init(&evs); + smm_setctx(&application); + #ifdef LV_WAYLAND_CLIENT_SIDE_DECORATIONS const char * env_disable_decorations = getenv("LV_WAYLAND_DISABLE_WINDOWDECORATION"); application.opt_disable_decorations = ((env_disable_decorations != NULL) && @@ -2230,12 +2334,14 @@ void lv_wayland_init(void) _lv_ll_init(&application.window_ll, sizeof(struct window)); +#ifndef LV_WAYLAND_TIMER_HANDLER application.cycle_timer = lv_timer_create(_lv_wayland_cycle, LV_WAYLAND_CYCLE_PERIOD, NULL); LV_ASSERT_MSG(application.cycle_timer, "failed to create cycle timer"); if (!application.cycle_timer) { return; } +#endif } /** @@ -2253,6 +2359,8 @@ void lv_wayland_deinit(void) } } + smm_deinit(); + if (application.shm) { wl_shm_destroy(application.shm); @@ -2327,7 +2435,7 @@ lv_disp_t * lv_wayland_create_window(lv_coord_t hor_res, lv_coord_t ver_res, cha window->close_cb = close_cb; /* Initialize draw buffer */ - buf1 = lv_mem_alloc(hor_res * ver_res * sizeof(lv_color_t)); + buf1 = lv_malloc(((hor_res * ver_res) / LVGL_DRAW_BUFFER_DIV) * sizeof(lv_color_t)); if (!buf1) { LV_LOG_ERROR("failed to allocate draw buffer"); @@ -2335,7 +2443,7 @@ lv_disp_t * lv_wayland_create_window(lv_coord_t hor_res, lv_coord_t ver_res, cha return NULL; } - lv_disp_draw_buf_init(&window->lv_disp_draw_buf, buf1, NULL, hor_res * ver_res); + lv_disp_draw_buf_init(&window->lv_disp_draw_buf, buf1, NULL, (hor_res * ver_res) / LVGL_DRAW_BUFFER_DIV); /* Initialize display driver */ lv_disp_drv_init(&window->lv_disp_drv); @@ -2437,38 +2545,6 @@ bool lv_wayland_window_is_open(lv_disp_t * disp) return open; } -/** - * Check if a Wayland flush is outstanding (i.e. data still needs to be sent to - * the compositor, but the compositor pipe/connection is unable to take more - * data at this time) for a window on the specified display. Otherwise (if - * argument is NULL), check if any window flush is outstanding. - * @return true if a flush is outstanding, false otherwise - */ -bool lv_wayland_window_is_flush_pending(lv_disp_t * disp) -{ - struct window *window; - bool flush_pending = false; - - if (disp == NULL) - { - _LV_LL_READ(&application.window_ll, window) - { - if (window->flush_pending) - { - flush_pending = true; - break; - } - } - } - else - { - window = disp->driver->user_data; - flush_pending = window->flush_pending; - } - - return flush_pending; -} - /** * Set/unset window fullscreen mode * @param disp LVGL display using window to be set/unset fullscreen @@ -2599,13 +2675,6 @@ uint32_t lv_wayland_timer_handler(void) lv_timer_t *input_timer[4]; uint32_t time_till_next; - /* Remove cycle timer (as this function is doing its work) */ - if (application.cycle_timer != NULL) - { - lv_timer_del(application.cycle_timer); - application.cycle_timer = NULL; - } - /* Wayland input handling */ _lv_wayland_handle_input(); @@ -2632,6 +2701,20 @@ uint32_t lv_wayland_timer_handler(void) /* Wayland output handling */ _lv_wayland_handle_output(); + + /* Set 'errno' if a Wayland flush is outstanding (i.e. data still needs to + * be sent to the compositor, but the compositor pipe/connection is unable + * to take more data at this time). + */ + _LV_LL_READ(&application.window_ll, window) + { + if (window->flush_pending) + { + errno = EAGAIN; + break; + } + } + return time_till_next; } #endif diff --git a/lib/lv_drivers/wayland/wayland.h b/lib/lv_drivers/wayland/wayland.h index 578af47..523d188 100644 --- a/lib/lv_drivers/wayland/wayland.h +++ b/lib/lv_drivers/wayland/wayland.h @@ -54,7 +54,6 @@ lv_disp_t * lv_wayland_create_window(lv_coord_t hor_res, lv_coord_t ver_res, cha lv_wayland_display_close_f_t close_cb); void lv_wayland_close_window(lv_disp_t * disp); bool lv_wayland_window_is_open(lv_disp_t * disp); -bool lv_wayland_window_is_flush_pending(lv_disp_t * disp); void lv_wayland_window_set_fullscreen(lv_disp_t * disp, bool fullscreen); lv_indev_t * lv_wayland_get_pointer(lv_disp_t * disp); lv_indev_t * lv_wayland_get_pointeraxis(lv_disp_t * disp); diff --git a/lib/lv_drivers/win32drv/win32drv.c b/lib/lv_drivers/win32drv/win32drv.c index 7a80434..4138741 100644 --- a/lib/lv_drivers/win32drv/win32drv.c +++ b/lib/lv_drivers/win32drv/win32drv.c @@ -12,6 +12,7 @@ #if USE_WIN32DRV #include +#include #include #include #include @@ -142,9 +143,6 @@ static void lv_win32_display_driver_flush_callback( const lv_area_t* area, lv_color_t* color_p); -static void lv_win32_display_refresh_handler( - lv_timer_t* param); - static void lv_win32_pointer_driver_read_callback( lv_indev_drv_t* indev_drv, lv_indev_data_t* data); @@ -157,6 +155,9 @@ static void lv_win32_encoder_driver_read_callback( lv_indev_drv_t* indev_drv, lv_indev_data_t* data); +static lv_win32_window_context_t* lv_win32_get_display_context( + lv_disp_t* display); + static LRESULT CALLBACK lv_win32_window_message_callback( HWND hWnd, UINT uMsg, @@ -166,6 +167,25 @@ static LRESULT CALLBACK lv_win32_window_message_callback( static unsigned int __stdcall lv_win32_window_thread_entrypoint( void* raw_parameter); +static void lv_win32_push_key_to_keyboard_queue( + lv_win32_window_context_t* context, + uint32_t key, + lv_indev_state_t state) +{ + lv_win32_keyboard_queue_item_t* current = + (lv_win32_keyboard_queue_item_t*)(_aligned_malloc( + sizeof(lv_win32_keyboard_queue_item_t), + MEMORY_ALLOCATION_ALIGNMENT)); + if (current) + { + current->key = key; + current->state = state; + InterlockedPushEntrySList( + context->keyboard_queue, + ¤t->ItemEntry); + } +} + /********************** * GLOBAL VARIABLES **********************/ @@ -182,24 +202,6 @@ EXTERN_C lv_indev_t* lv_win32_encoder_device_object = NULL; static HWND g_window_handle = NULL; -static HDC g_buffer_dc_handle = NULL; -static UINT32* g_pixel_buffer = NULL; -static SIZE_T g_pixel_buffer_size = 0; - -static lv_disp_t* g_display = NULL; -static bool volatile g_display_refreshing = false; - -static bool volatile g_mouse_pressed = false; -static LPARAM volatile g_mouse_value = 0; - -static bool volatile g_mousewheel_pressed = false; -static int16_t volatile g_mousewheel_value = 0; - -static bool volatile g_keyboard_pressed = false; -static WPARAM volatile g_keyboard_value = 0; - -static int volatile g_dpi_value = USER_DEFAULT_SCREEN_DPI; - /********************** * MACROS **********************/ @@ -238,6 +240,72 @@ EXTERN_C void lv_win32_add_all_input_devices_to_group( lv_indev_set_group(lv_win32_encoder_device_object, group); } +EXTERN_C lv_win32_window_context_t* lv_win32_get_window_context( + HWND window_handle) +{ + return (lv_win32_window_context_t*)( + GetPropW(window_handle, L"LVGL.SimulatorWindow.WindowContext")); +} + +EXTERN_C bool lv_win32_init_window_class() +{ + WNDCLASSEXW window_class; + window_class.cbSize = sizeof(WNDCLASSEXW); + window_class.style = 0; + window_class.lpfnWndProc = lv_win32_window_message_callback; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = NULL; + window_class.hIcon = NULL; + window_class.hCursor = LoadCursorW(NULL, IDC_ARROW); + window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + window_class.lpszMenuName = NULL; + window_class.lpszClassName = LVGL_SIMULATOR_WINDOW_CLASS; + window_class.hIconSm = NULL; + return RegisterClassExW(&window_class); +} + +EXTERN_C HWND lv_win32_create_display_window( + const wchar_t* window_title, + lv_coord_t hor_res, + lv_coord_t ver_res, + HINSTANCE instance_handle, + HICON icon_handle, + int show_window_mode) +{ + HWND display_window_handle = CreateWindowExW( + WINDOW_EX_STYLE, + LVGL_SIMULATOR_WINDOW_CLASS, + window_title, + WINDOW_STYLE, + CW_USEDEFAULT, + 0, + hor_res, + ver_res, + NULL, + NULL, + instance_handle, + NULL); + if (display_window_handle) + { + SendMessageW( + display_window_handle, + WM_SETICON, + TRUE, + (LPARAM)icon_handle); + SendMessageW( + display_window_handle, + WM_SETICON, + FALSE, + (LPARAM)icon_handle); + + ShowWindow(display_window_handle, show_window_mode); + UpdateWindow(display_window_handle); + } + + return display_window_handle; +} + EXTERN_C bool lv_win32_init( HINSTANCE instance_handle, int show_window_mode, @@ -245,6 +313,11 @@ EXTERN_C bool lv_win32_init( lv_coord_t ver_res, HICON icon_handle) { + if (!lv_win32_init_window_class()) + { + return false; + } + PWINDOW_THREAD_PARAMETER parameter = (PWINDOW_THREAD_PARAMETER)malloc(sizeof(WINDOW_THREAD_PARAMETER)); parameter->window_mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS); @@ -264,53 +337,16 @@ EXTERN_C bool lv_win32_init( WaitForSingleObjectEx(parameter->window_mutex, INFINITE, FALSE); - static lv_disp_draw_buf_t display_buffer; -#if (LV_COLOR_DEPTH == 32) || \ - (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \ - (LV_COLOR_DEPTH == 8) || \ - (LV_COLOR_DEPTH == 1) - lv_disp_draw_buf_init( - &display_buffer, - (lv_color_t*)g_pixel_buffer, - NULL, - hor_res * ver_res); -#else - lv_disp_draw_buf_init( - &display_buffer, - (lv_color_t*)malloc(hor_res * ver_res * sizeof(lv_color_t)), - NULL, - hor_res * ver_res); -#endif + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(g_window_handle)); + if (!context) + { + return false; + } - static lv_disp_drv_t display_driver; - lv_disp_drv_init(&display_driver); - display_driver.hor_res = hor_res; - display_driver.ver_res = ver_res; - display_driver.flush_cb = lv_win32_display_driver_flush_callback; - display_driver.draw_buf = &display_buffer; - display_driver.direct_mode = 1; - g_display = lv_disp_drv_register(&display_driver); - lv_timer_del(g_display->refr_timer); - g_display->refr_timer = NULL; - lv_timer_create(lv_win32_display_refresh_handler, 0, NULL); - - static lv_indev_drv_t pointer_driver; - lv_indev_drv_init(&pointer_driver); - pointer_driver.type = LV_INDEV_TYPE_POINTER; - pointer_driver.read_cb = lv_win32_pointer_driver_read_callback; - lv_win32_pointer_device_object = lv_indev_drv_register(&pointer_driver); - - static lv_indev_drv_t keypad_driver; - lv_indev_drv_init(&keypad_driver); - keypad_driver.type = LV_INDEV_TYPE_KEYPAD; - keypad_driver.read_cb = lv_win32_keypad_driver_read_callback; - lv_win32_keypad_device_object = lv_indev_drv_register(&keypad_driver); - - static lv_indev_drv_t encoder_driver; - lv_indev_drv_init(&encoder_driver); - encoder_driver.type = LV_INDEV_TYPE_ENCODER; - encoder_driver.read_cb = lv_win32_encoder_driver_read_callback; - lv_win32_encoder_device_object = lv_indev_drv_register(&encoder_driver); + lv_win32_pointer_device_object = context->mouse_device_object; + lv_win32_keypad_device_object = context->keyboard_device_object; + lv_win32_encoder_device_object = context->mousewheel_device_object; return true; } @@ -621,161 +657,119 @@ static void lv_win32_display_driver_flush_callback( const lv_area_t* area, lv_color_t* color_p) { - if (lv_disp_flush_is_last(disp_drv)) + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context((HWND)disp_drv->user_data)); + if (context) { + if (lv_disp_flush_is_last(disp_drv)) + { #if (LV_COLOR_DEPTH == 32) || \ (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \ (LV_COLOR_DEPTH == 8) || \ (LV_COLOR_DEPTH == 1) - UNREFERENCED_PARAMETER(color_p); + UNREFERENCED_PARAMETER(color_p); #elif (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0) - SIZE_T count = g_pixel_buffer_size / sizeof(UINT16); - PUINT16 source = (PUINT16)color_p; - PUINT16 destination = (PUINT16)g_pixel_buffer; - for (SIZE_T i = 0; i < count; ++i) - { - UINT16 current = *source; - *destination = (LOBYTE(current) << 8) | HIBYTE(current); + SIZE_T count = context->display_framebuffer_size / sizeof(UINT16); + PUINT16 source = (PUINT16)color_p; + PUINT16 destination = (PUINT16)context->display_framebuffer_base; + for (SIZE_T i = 0; i < count; ++i) + { + UINT16 current = *source; + *destination = (LOBYTE(current) << 8) | HIBYTE(current); - ++source; - ++destination; - } + ++source; + ++destination; + } #else - for (int y = area->y1; y <= area->y2; ++y) - { - for (int x = area->x1; x <= area->x2; ++x) + uint32_t* destination = context->display_framebuffer_base; + + for (int y = area->y1; y <= area->y2; ++y) { - g_pixel_buffer[y * disp_drv->hor_res + x] = - lv_color_to32(*color_p); - color_p++; + for (int x = area->x1; x <= area->x2; ++x) + { + destination[y * disp_drv->hor_res + x] = + lv_color_to32(*color_p); + color_p++; + } } - } #endif - InvalidateRect(g_window_handle, NULL, FALSE); + InvalidateRect(disp_drv->user_data, NULL, FALSE); + } } lv_disp_flush_ready(disp_drv); } -static void lv_win32_display_refresh_handler( - lv_timer_t* param) -{ - UNREFERENCED_PARAMETER(param); - - if (!g_display_refreshing) - { - _lv_disp_refr_timer(NULL); - } -} - static void lv_win32_pointer_driver_read_callback( lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { - UNREFERENCED_PARAMETER(indev_drv); - - data->state = (lv_indev_state_t)( - g_mouse_pressed ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL); - - data->point.x = MulDiv( - GET_X_LPARAM(g_mouse_value), - USER_DEFAULT_SCREEN_DPI, - WIN32DRV_MONITOR_ZOOM * g_dpi_value); - data->point.y = MulDiv( - GET_Y_LPARAM(g_mouse_value), - USER_DEFAULT_SCREEN_DPI, - WIN32DRV_MONITOR_ZOOM * g_dpi_value); - - if (data->point.x < 0) - { - data->point.x = 0; - } - if (data->point.x > g_display->driver->hor_res - 1) - { - data->point.x = g_display->driver->hor_res - 1; - } - if (data->point.y < 0) - { - data->point.y = 0; - } - if (data->point.y > g_display->driver->ver_res - 1) + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_display_context(indev_drv->disp)); + if (!context) { - data->point.y = g_display->driver->ver_res - 1; + return; } + + data->state = context->mouse_state; + data->point = context->mouse_point; } static void lv_win32_keypad_driver_read_callback( lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { - UNREFERENCED_PARAMETER(indev_drv); - - data->state = (lv_indev_state_t)( - g_keyboard_pressed ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL); + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_display_context(indev_drv->disp)); + if (!context) + { + return; + } - WPARAM KeyboardValue = g_keyboard_value; + EnterCriticalSection(&context->keyboard_mutex); - switch (KeyboardValue) + lv_win32_keyboard_queue_item_t* current = + (lv_win32_keyboard_queue_item_t*)(InterlockedPopEntrySList( + context->keyboard_queue)); + if (current) { - case VK_UP: - data->key = LV_KEY_UP; - break; - case VK_DOWN: - data->key = LV_KEY_DOWN; - break; - case VK_LEFT: - data->key = LV_KEY_LEFT; - break; - case VK_RIGHT: - data->key = LV_KEY_RIGHT; - break; - case VK_ESCAPE: - data->key = LV_KEY_ESC; - break; - case VK_DELETE: - data->key = LV_KEY_DEL; - break; - case VK_BACK: - data->key = LV_KEY_BACKSPACE; - break; - case VK_RETURN: - data->key = LV_KEY_ENTER; - break; - case VK_NEXT: - data->key = LV_KEY_NEXT; - break; - case VK_PRIOR: - data->key = LV_KEY_PREV; - break; - case VK_HOME: - data->key = LV_KEY_HOME; - break; - case VK_END: - data->key = LV_KEY_END; - break; - default: - if (KeyboardValue >= 'A' && KeyboardValue <= 'Z') - { - KeyboardValue += 0x20; - } + data->key = current->key; + data->state = current->state; - data->key = (uint32_t)KeyboardValue; + _aligned_free(current); - break; + data->continue_reading = true; } + + LeaveCriticalSection(&context->keyboard_mutex); } static void lv_win32_encoder_driver_read_callback( lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { - UNREFERENCED_PARAMETER(indev_drv); + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_display_context(indev_drv->disp)); + if (!context) + { + return; + } + + data->state = context->mousewheel_state; + data->enc_diff = context->mousewheel_enc_diff; + context->mousewheel_enc_diff = 0; +} + +static lv_win32_window_context_t* lv_win32_get_display_context( + lv_disp_t* display) +{ + if (display) + { + return lv_win32_get_window_context((HWND)display->driver->user_data); + } - data->state = (lv_indev_state_t)( - g_mousewheel_pressed ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL); - data->enc_diff = g_mousewheel_value; - g_mousewheel_value = 0; + return NULL; } static LRESULT CALLBACK lv_win32_window_message_callback( @@ -786,155 +780,550 @@ static LRESULT CALLBACK lv_win32_window_message_callback( { switch (uMsg) { + case WM_CREATE: + { + // Note: Return -1 directly because WM_DESTROY message will be sent + // when destroy the window automatically. We free the resource when + // processing the WM_DESTROY message of this window. + + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + malloc(sizeof(lv_win32_window_context_t))); + if (!context) + { + return -1; + } + + RECT request_content_size; + GetWindowRect(hWnd, &request_content_size); + + context->display_hor_res = + request_content_size.right - request_content_size.left; + context->display_ver_res = + request_content_size.bottom - request_content_size.top; + context->display_dpi = lv_win32_get_dpi_for_window(hWnd); + context->display_framebuffer_context_handle = + lv_win32_create_frame_buffer( + hWnd, + context->display_hor_res, + context->display_ver_res, + &context->display_framebuffer_base, + &context->display_framebuffer_size); +#if (LV_COLOR_DEPTH == 32) || \ + (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \ + (LV_COLOR_DEPTH == 8) || \ + (LV_COLOR_DEPTH == 1) + lv_disp_draw_buf_init( + &context->display_buffer, + (lv_color_t*)context->display_framebuffer_base, + NULL, + context->display_hor_res * context->display_ver_res); +#else + size_t draw_buffer_size = sizeof(lv_color_t); + draw_buffer_size *= context->display_hor_res; + draw_buffer_size *= context->display_ver_res; + lv_disp_draw_buf_init( + &context->display_buffer, + (lv_color_t*)malloc(draw_buffer_size), + NULL, + context->display_hor_res * context->display_ver_res); +#endif + lv_disp_drv_init(&context->display_driver); + context->display_driver.hor_res = context->display_hor_res; + context->display_driver.ver_res = context->display_ver_res; + context->display_driver.flush_cb = + lv_win32_display_driver_flush_callback; + context->display_driver.draw_buf = &context->display_buffer; + context->display_driver.direct_mode = 1; + context->display_driver.user_data = hWnd; + context->display_device_object = + lv_disp_drv_register(&context->display_driver); + if (!context->display_device_object) + { + return -1; + } + + context->mouse_state = LV_INDEV_STATE_REL; + context->mouse_point.x = 0; + context->mouse_point.y = 0; + lv_indev_drv_init(&context->mouse_driver); + context->mouse_driver.type = LV_INDEV_TYPE_POINTER; + context->mouse_driver.disp = context->display_device_object; + context->mouse_driver.read_cb = + lv_win32_pointer_driver_read_callback; + context->mouse_device_object = + lv_indev_drv_register(&context->mouse_driver); + if (!context->mouse_device_object) + { + return -1; + } + + context->mousewheel_state = LV_INDEV_STATE_REL; + context->mousewheel_enc_diff = 0; + lv_indev_drv_init(&context->mousewheel_driver); + context->mousewheel_driver.type = LV_INDEV_TYPE_ENCODER; + context->mousewheel_driver.disp = context->display_device_object; + context->mousewheel_driver.read_cb = + lv_win32_encoder_driver_read_callback; + context->mousewheel_device_object = + lv_indev_drv_register(&context->mousewheel_driver); + if (!context->mousewheel_device_object) + { + return -1; + } + + InitializeCriticalSection(&context->keyboard_mutex); + context->keyboard_queue = _aligned_malloc( + sizeof(SLIST_HEADER), + MEMORY_ALLOCATION_ALIGNMENT); + if (!context->keyboard_queue) + { + return -1; + } + InitializeSListHead(context->keyboard_queue); + context->keyboard_utf16_high_surrogate = 0; + context->keyboard_utf16_low_surrogate = 0; + lv_indev_drv_init(&context->keyboard_driver); + context->keyboard_driver.type = LV_INDEV_TYPE_KEYPAD; + context->keyboard_driver.disp = context->display_device_object; + context->keyboard_driver.read_cb = + lv_win32_keypad_driver_read_callback; + context->keyboard_device_object = + lv_indev_drv_register(&context->keyboard_driver); + if (!context->keyboard_device_object) + { + return -1; + } + + if (!SetPropW( + hWnd, + L"LVGL.SimulatorWindow.WindowContext", + (HANDLE)(context))) + { + return -1; + } + + RECT calculated_window_size; + + calculated_window_size.left = 0; + calculated_window_size.right = MulDiv( + context->display_hor_res * WIN32DRV_MONITOR_ZOOM, + context->display_dpi, + USER_DEFAULT_SCREEN_DPI); + calculated_window_size.top = 0; + calculated_window_size.bottom = MulDiv( + context->display_ver_res * WIN32DRV_MONITOR_ZOOM, + context->display_dpi, + USER_DEFAULT_SCREEN_DPI); + + AdjustWindowRectEx( + &calculated_window_size, + WINDOW_STYLE, + FALSE, + WINDOW_EX_STYLE); + OffsetRect( + &calculated_window_size, + -calculated_window_size.left, + -calculated_window_size.top); + + SetWindowPos( + hWnd, + NULL, + 0, + 0, + calculated_window_size.right, + calculated_window_size.bottom, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); + + lv_win32_register_touch_window(hWnd, 0); + + lv_win32_enable_child_window_dpi_message(hWnd); + + break; + } case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: { - g_mouse_value = lParam; + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (!context) + { + return 0; + } + + context->mouse_point.x = MulDiv( + GET_X_LPARAM(lParam), + USER_DEFAULT_SCREEN_DPI, + WIN32DRV_MONITOR_ZOOM * context->display_dpi); + context->mouse_point.y = MulDiv( + GET_Y_LPARAM(lParam), + USER_DEFAULT_SCREEN_DPI, + WIN32DRV_MONITOR_ZOOM * context->display_dpi); + if (context->mouse_point.x < 0) + { + context->mouse_point.x = 0; + } + if (context->mouse_point.x > context->display_hor_res - 1) + { + context->mouse_point.x = context->display_hor_res - 1; + } + if (context->mouse_point.y < 0) + { + context->mouse_point.y = 0; + } + if (context->mouse_point.y > context->display_ver_res - 1) + { + context->mouse_point.y = context->display_ver_res - 1; + } + if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP) { - g_mouse_pressed = (uMsg == WM_LBUTTONDOWN); + context->mouse_state = ( + uMsg == WM_LBUTTONDOWN + ? LV_INDEV_STATE_PR + : LV_INDEV_STATE_REL); } else if (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP) { - g_mousewheel_pressed = (uMsg == WM_MBUTTONDOWN); + context->mousewheel_state = ( + uMsg == WM_MBUTTONDOWN + ? LV_INDEV_STATE_PR + : LV_INDEV_STATE_REL); } return 0; } case WM_KEYDOWN: case WM_KEYUP: { - g_keyboard_pressed = (uMsg == WM_KEYDOWN); - g_keyboard_value = wParam; + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (context) + { + EnterCriticalSection(&context->keyboard_mutex); + + bool skip_translation = false; + uint32_t translated_key = 0; + + switch (wParam) + { + case VK_UP: + translated_key = LV_KEY_UP; + break; + case VK_DOWN: + translated_key = LV_KEY_DOWN; + break; + case VK_LEFT: + translated_key = LV_KEY_LEFT; + break; + case VK_RIGHT: + translated_key = LV_KEY_RIGHT; + break; + case VK_ESCAPE: + translated_key = LV_KEY_ESC; + break; + case VK_DELETE: + translated_key = LV_KEY_DEL; + break; + case VK_BACK: + translated_key = LV_KEY_BACKSPACE; + break; + case VK_RETURN: + translated_key = LV_KEY_ENTER; + break; + case VK_TAB: + case VK_NEXT: + translated_key = LV_KEY_NEXT; + break; + case VK_PRIOR: + translated_key = LV_KEY_PREV; + break; + case VK_HOME: + translated_key = LV_KEY_HOME; + break; + case VK_END: + translated_key = LV_KEY_END; + break; + default: + skip_translation = true; + break; + } + + if (!skip_translation) + { + lv_win32_push_key_to_keyboard_queue( + context, + translated_key, + ((uMsg == WM_KEYUP) + ? LV_INDEV_STATE_REL + : LV_INDEV_STATE_PR)); + } + + LeaveCriticalSection(&context->keyboard_mutex); + } + + break; + } + case WM_CHAR: + { + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (context) + { + EnterCriticalSection(&context->keyboard_mutex); + + uint16_t raw_code_point = (uint16_t)(wParam); + + if (raw_code_point >= 0x20 && raw_code_point != 0x7F) + { + if (IS_HIGH_SURROGATE(raw_code_point)) + { + context->keyboard_utf16_high_surrogate = raw_code_point; + } + else if (IS_LOW_SURROGATE(raw_code_point)) + { + context->keyboard_utf16_low_surrogate = raw_code_point; + } + + uint32_t code_point = raw_code_point; + + if (context->keyboard_utf16_high_surrogate && + context->keyboard_utf16_low_surrogate) + { + uint16_t high_surrogate = + context->keyboard_utf16_high_surrogate; + uint16_t low_surrogate = + context->keyboard_utf16_low_surrogate; + + code_point = (low_surrogate & 0x03FF); + code_point += (((high_surrogate & 0x03FF) + 0x40) << 10); + + context->keyboard_utf16_high_surrogate = 0; + context->keyboard_utf16_low_surrogate = 0; + } + + uint32_t lvgl_code_point = + _lv_txt_unicode_to_encoded(code_point); + + lv_win32_push_key_to_keyboard_queue( + context, + lvgl_code_point, + LV_INDEV_STATE_PR); + lv_win32_push_key_to_keyboard_queue( + context, + lvgl_code_point, + LV_INDEV_STATE_REL); + } + + LeaveCriticalSection(&context->keyboard_mutex); + } + break; } case WM_MOUSEWHEEL: { - g_mousewheel_value = -(GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA); + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (context) + { + context->mousewheel_enc_diff = + -(GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA); + } + break; } case WM_TOUCH: { - UINT cInputs = LOWORD(wParam); - HTOUCHINPUT hTouchInput = (HTOUCHINPUT)(lParam); - - PTOUCHINPUT pInputs = malloc(cInputs * sizeof(TOUCHINPUT)); - if (pInputs) + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (context) { - if (lv_win32_get_touch_input_info( - hTouchInput, - cInputs, - pInputs, - sizeof(TOUCHINPUT))) + UINT cInputs = LOWORD(wParam); + HTOUCHINPUT hTouchInput = (HTOUCHINPUT)(lParam); + + PTOUCHINPUT pInputs = malloc(cInputs * sizeof(TOUCHINPUT)); + if (pInputs) { - for (UINT i = 0; i < cInputs; ++i) + if (lv_win32_get_touch_input_info( + hTouchInput, + cInputs, + pInputs, + sizeof(TOUCHINPUT))) { - POINT Point; - Point.x = TOUCH_COORD_TO_PIXEL(pInputs[i].x); - Point.y = TOUCH_COORD_TO_PIXEL(pInputs[i].y); - if (!ScreenToClient(hWnd, &Point)) + for (UINT i = 0; i < cInputs; ++i) { - continue; + POINT Point; + Point.x = TOUCH_COORD_TO_PIXEL(pInputs[i].x); + Point.y = TOUCH_COORD_TO_PIXEL(pInputs[i].y); + if (!ScreenToClient(hWnd, &Point)) + { + continue; + } + + context->mouse_point.x = MulDiv( + Point.x, + USER_DEFAULT_SCREEN_DPI, + WIN32DRV_MONITOR_ZOOM * context->display_dpi); + context->mouse_point.y = MulDiv( + Point.y, + USER_DEFAULT_SCREEN_DPI, + WIN32DRV_MONITOR_ZOOM * context->display_dpi); + + DWORD MousePressedMask = + TOUCHEVENTF_MOVE | TOUCHEVENTF_DOWN; + + context->mouse_state = ( + pInputs[i].dwFlags & MousePressedMask + ? LV_INDEV_STATE_PR + : LV_INDEV_STATE_REL); } - - uint16_t x = (uint16_t)(Point.x & 0xffff); - uint16_t y = (uint16_t)(Point.y & 0xffff); - - DWORD MousePressedMask = - TOUCHEVENTF_MOVE | TOUCHEVENTF_DOWN; - - g_mouse_value = (y << 16) | x; - g_mouse_pressed = (pInputs[i].dwFlags & MousePressedMask); } + + free(pInputs); } - free(pInputs); + lv_win32_close_touch_input_handle(hTouchInput); } - lv_win32_close_touch_input_handle(hTouchInput); - break; } case WM_DPICHANGED: { - g_dpi_value = HIWORD(wParam); - - LPRECT SuggestedRect = (LPRECT)lParam; + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (context) + { + context->display_dpi = HIWORD(wParam); - SetWindowPos( - hWnd, - NULL, - SuggestedRect->left, - SuggestedRect->top, - SuggestedRect->right, - SuggestedRect->bottom, - SWP_NOZORDER | SWP_NOACTIVATE); - - RECT ClientRect; - GetClientRect(hWnd, &ClientRect); - - int WindowWidth = MulDiv( - g_display->driver->hor_res * WIN32DRV_MONITOR_ZOOM, - g_dpi_value, - USER_DEFAULT_SCREEN_DPI); - int WindowHeight = MulDiv( - g_display->driver->ver_res * WIN32DRV_MONITOR_ZOOM, - g_dpi_value, - USER_DEFAULT_SCREEN_DPI); + LPRECT SuggestedRect = (LPRECT)lParam; - SetWindowPos( - hWnd, - NULL, - SuggestedRect->left, - SuggestedRect->top, - SuggestedRect->right + (WindowWidth - ClientRect.right), - SuggestedRect->bottom + (WindowHeight - ClientRect.bottom), - SWP_NOZORDER | SWP_NOACTIVATE); + SetWindowPos( + hWnd, + NULL, + SuggestedRect->left, + SuggestedRect->top, + SuggestedRect->right, + SuggestedRect->bottom, + SWP_NOZORDER | SWP_NOACTIVATE); + + RECT ClientRect; + GetClientRect(hWnd, &ClientRect); + + int WindowWidth = MulDiv( + context->display_hor_res * WIN32DRV_MONITOR_ZOOM, + context->display_dpi, + USER_DEFAULT_SCREEN_DPI); + int WindowHeight = MulDiv( + context->display_ver_res * WIN32DRV_MONITOR_ZOOM, + context->display_dpi, + USER_DEFAULT_SCREEN_DPI); + + SetWindowPos( + hWnd, + NULL, + SuggestedRect->left, + SuggestedRect->top, + SuggestedRect->right + (WindowWidth - ClientRect.right), + SuggestedRect->bottom + (WindowHeight - ClientRect.bottom), + SWP_NOZORDER | SWP_NOACTIVATE); + } break; } case WM_PAINT: { - g_display_refreshing = true; - PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); - if (g_display) + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + lv_win32_get_window_context(hWnd)); + if (context) { - SetStretchBltMode(hdc, HALFTONE); - - StretchBlt( - hdc, - ps.rcPaint.left, - ps.rcPaint.top, - ps.rcPaint.right - ps.rcPaint.left, - ps.rcPaint.bottom - ps.rcPaint.top, - g_buffer_dc_handle, - 0, - 0, - MulDiv( + if (context->display_framebuffer_context_handle) + { + SetStretchBltMode(hdc, HALFTONE); + + StretchBlt( + hdc, + ps.rcPaint.left, + ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, - USER_DEFAULT_SCREEN_DPI, - WIN32DRV_MONITOR_ZOOM * g_dpi_value), - MulDiv( ps.rcPaint.bottom - ps.rcPaint.top, - USER_DEFAULT_SCREEN_DPI, - WIN32DRV_MONITOR_ZOOM * g_dpi_value), - SRCCOPY); + context->display_framebuffer_context_handle, + 0, + 0, + MulDiv( + ps.rcPaint.right - ps.rcPaint.left, + USER_DEFAULT_SCREEN_DPI, + WIN32DRV_MONITOR_ZOOM * context->display_dpi), + MulDiv( + ps.rcPaint.bottom - ps.rcPaint.top, + USER_DEFAULT_SCREEN_DPI, + WIN32DRV_MONITOR_ZOOM * context->display_dpi), + SRCCOPY); + } } EndPaint(hWnd, &ps); - g_display_refreshing = false; - break; } case WM_DESTROY: + { + lv_win32_window_context_t* context = (lv_win32_window_context_t*)( + RemovePropW(hWnd, L"LVGL.SimulatorWindow.WindowContext")); + if (context) + { + lv_disp_t* display_device_object = context->display_device_object; + context->display_device_object = NULL; + lv_disp_remove(display_device_object); +#if (LV_COLOR_DEPTH == 32) || \ + (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \ + (LV_COLOR_DEPTH == 8) || \ + (LV_COLOR_DEPTH == 1) +#else + free(context->display_buffer.buf1); +#endif + DeleteDC(context->display_framebuffer_context_handle); + + lv_indev_t* mouse_device_object = + context->mouse_device_object; + context->mouse_device_object = NULL; + lv_indev_delete(mouse_device_object); + + lv_indev_t* mousewheel_device_object = + context->mousewheel_device_object; + context->mousewheel_device_object = NULL; + lv_indev_delete(mousewheel_device_object); + + lv_indev_t* keyboard_device_object = + context->keyboard_device_object; + context->keyboard_device_object = NULL; + lv_indev_delete(keyboard_device_object); + do + { + PSLIST_ENTRY current = InterlockedPopEntrySList( + context->keyboard_queue); + if (!current) + { + _aligned_free(context->keyboard_queue); + context->keyboard_queue = NULL; + break; + } + + _aligned_free(current); + + } while (true); + DeleteCriticalSection(&context->keyboard_mutex); + + free(context); + } + PostQuitMessage(0); + break; + } default: return DefWindowProcW(hWnd, uMsg, wParam, lParam); } @@ -948,95 +1337,18 @@ static unsigned int __stdcall lv_win32_window_thread_entrypoint( PWINDOW_THREAD_PARAMETER parameter = (PWINDOW_THREAD_PARAMETER)raw_parameter; - WNDCLASSEXW window_class; - window_class.cbSize = sizeof(WNDCLASSEXW); - window_class.style = 0; - window_class.lpfnWndProc = lv_win32_window_message_callback; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = parameter->instance_handle; - window_class.hIcon = parameter->icon_handle; - window_class.hCursor = LoadCursorW(NULL, IDC_ARROW); - window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - window_class.lpszMenuName = NULL; - window_class.lpszClassName = L"lv_sim_visual_studio"; - window_class.hIconSm = parameter->icon_handle; - if (!RegisterClassExW(&window_class)) - { - return 0; - } - - HWND window_handle = CreateWindowExW( - WINDOW_EX_STYLE, - window_class.lpszClassName, - L"LVGL Simulator for Windows Desktop", - WINDOW_STYLE, - CW_USEDEFAULT, - 0, - CW_USEDEFAULT, - 0, - NULL, - NULL, + g_window_handle = lv_win32_create_display_window( + L"LVGL Simulator for Windows Desktop (Display 1)", + parameter->hor_res, + parameter->ver_res, parameter->instance_handle, - NULL); - - if (!window_handle) + parameter->icon_handle, + parameter->show_window_mode); + if (!g_window_handle) { return 0; } - g_dpi_value = lv_win32_get_dpi_for_window(window_handle); - - RECT window_size; - - window_size.left = 0; - window_size.right = MulDiv( - parameter->hor_res * WIN32DRV_MONITOR_ZOOM, - g_dpi_value, - USER_DEFAULT_SCREEN_DPI); - window_size.top = 0; - window_size.bottom = MulDiv( - parameter->ver_res * WIN32DRV_MONITOR_ZOOM, - g_dpi_value, - USER_DEFAULT_SCREEN_DPI); - - AdjustWindowRectEx( - &window_size, - WINDOW_STYLE, - FALSE, - WINDOW_EX_STYLE); - OffsetRect( - &window_size, - -window_size.left, - -window_size.top); - - SetWindowPos( - window_handle, - NULL, - 0, - 0, - window_size.right, - window_size.bottom, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - - lv_win32_register_touch_window(window_handle, 0); - - lv_win32_enable_child_window_dpi_message(window_handle); - - HDC hNewBufferDC = lv_win32_create_frame_buffer( - window_handle, - parameter->hor_res, - parameter->ver_res, - &g_pixel_buffer, - &g_pixel_buffer_size); - - DeleteDC(g_buffer_dc_handle); - g_buffer_dc_handle = hNewBufferDC; - - ShowWindow(window_handle, parameter->show_window_mode); - UpdateWindow(window_handle); - g_window_handle = window_handle; - SetEvent(parameter->window_mutex); MSG message; diff --git a/lib/lv_drivers/win32drv/win32drv.h b/lib/lv_drivers/win32drv/win32drv.h index d20c664..5f8736f 100644 --- a/lib/lv_drivers/win32drv/win32drv.h +++ b/lib/lv_drivers/win32drv/win32drv.h @@ -20,7 +20,11 @@ #if USE_WIN32DRV -#include +#if LV_USE_USER_DATA == 0 +#error "Support for user data is required by new Win32 driver. Set LV_USE_USER_DATA to 1 in lv_conf.h" +#endif + +#include #if _MSC_VER >= 1200 // Disable compilation warnings. @@ -46,10 +50,50 @@ * DEFINES *********************/ +#define LVGL_SIMULATOR_WINDOW_CLASS L"LVGL.SimulatorWindow" + /********************** * TYPEDEFS **********************/ +typedef struct _lv_win32_keyboard_queue_item_t +{ + SLIST_ENTRY ItemEntry; + uint32_t key; + lv_indev_state_t state; +} lv_win32_keyboard_queue_item_t; + +typedef struct _lv_win32_window_context_t +{ + lv_disp_t* display_device_object; + lv_indev_t* mouse_device_object; + lv_indev_t* mousewheel_device_object; + lv_indev_t* keyboard_device_object; + + lv_coord_t display_hor_res; + lv_coord_t display_ver_res; + uint32_t display_dpi; + HDC display_framebuffer_context_handle; + uint32_t* display_framebuffer_base; + size_t display_framebuffer_size; + lv_disp_draw_buf_t display_buffer; + lv_disp_drv_t display_driver; + + lv_indev_state_t mouse_state; + lv_point_t mouse_point; + lv_indev_drv_t mouse_driver; + + lv_indev_state_t mousewheel_state; + int16_t mousewheel_enc_diff; + lv_indev_drv_t mousewheel_driver; + + CRITICAL_SECTION keyboard_mutex; + PSLIST_HEADER keyboard_queue; + uint16_t keyboard_utf16_high_surrogate; + uint16_t keyboard_utf16_low_surrogate; + lv_indev_drv_t keyboard_driver; +} lv_win32_window_context_t; + /********************** * GLOBAL PROTOTYPES **********************/ @@ -63,6 +107,19 @@ EXTERN_C lv_indev_t* lv_win32_encoder_device_object; EXTERN_C void lv_win32_add_all_input_devices_to_group( lv_group_t* group); +EXTERN_C lv_win32_window_context_t* lv_win32_get_window_context( + HWND window_handle); + +EXTERN_C bool lv_win32_init_window_class(); + +EXTERN_C HWND lv_win32_create_display_window( + const wchar_t* window_title, + lv_coord_t hor_res, + lv_coord_t ver_res, + HINSTANCE instance_handle, + HICON icon_handle, + int show_window_mode); + EXTERN_C bool lv_win32_init( HINSTANCE instance_handle, int show_window_mode, diff --git a/lib/lv_drivers/x11/x11.c b/lib/lv_drivers/x11/x11.c new file mode 100644 index 0000000..952328b --- /dev/null +++ b/lib/lv_drivers/x11/x11.c @@ -0,0 +1,281 @@ +/** + * @file x11.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "x11.h" +#if USE_X11 +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#ifndef KEYBOARD_BUFFER_SIZE + #define KEYBOARD_BUFFER_SIZE 64 +#endif + +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) + +#ifndef X11_OPTIMIZED_SCREEN_UPDATE + #define X11_OPTIMIZED_SCREEN_UPDATE 1 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static Display* display = NULL; +static Window window = (XID)-1; +static GC gc = NULL; +static XImage* ximage = NULL; +static lv_timer_t* timer = NULL; + +static char kb_buffer[KEYBOARD_BUFFER_SIZE]; +static lv_point_t mouse_pos = { 0, 0 }; +static bool left_mouse_btn = false; +static bool right_mouse_btn = false; +static bool wheel_mouse_btn = false; +static int16_t wheel_cnt = 0; + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ +static int predicate(Display* disp, XEvent* evt, XPointer arg) { return 1; } + +static void x11_event_handler(lv_timer_t * t) +{ + XEvent myevent; + KeySym mykey; + int n; + + /* handle all outstanding X events */ + while (XCheckIfEvent(display, &myevent, predicate, NULL)) { + switch(myevent.type) + { + case Expose: + if(myevent.xexpose.count==0) + { + XPutImage(display, window, gc, ximage, 0, 0, 0, 0, LV_HOR_RES, LV_VER_RES); + } + break; + case MotionNotify: + mouse_pos.x = myevent.xmotion.x; + mouse_pos.y = myevent.xmotion.y; + break; + case ButtonPress: + switch (myevent.xbutton.button) + { + case Button1: + left_mouse_btn = true; + break; + case Button2: + wheel_mouse_btn = true; + break; + case Button3: + right_mouse_btn = true; + break; + case Button4: + wheel_cnt--; // Scrolled up + break; + case Button5: + wheel_cnt++; // Scrolled down + break; + default: + LV_LOG_WARN("unhandled button press : %d", myevent.xbutton.button); + } + break; + case ButtonRelease: + switch (myevent.xbutton.button) + { + case Button1: + left_mouse_btn = false; + break; + case Button2: + wheel_mouse_btn = false; + break; + case Button3: + right_mouse_btn = false; + break; + } + break; + case KeyPress: + n = XLookupString(&myevent.xkey, &kb_buffer[0], sizeof(kb_buffer), &mykey, NULL); + kb_buffer[n] = '\0'; + break; + case KeyRelease: + break; + default: + LV_LOG_WARN("unhandled x11 event: %d", myevent.type); + } + } +} + +static void lv_x11_hide_cursor() +{ + XColor black = { .red = 0, .green = 0, .blue = 0 }; + char empty_data[] = { 0 }; + + Pixmap empty_bitmap = XCreateBitmapFromData(display, window, empty_data, 1, 1); + Cursor inv_cursor = XCreatePixmapCursor(display, empty_bitmap, empty_bitmap, &black, &black, 0, 0); + XDefineCursor(display, window, inv_cursor); + XFreeCursor(display, inv_cursor); + XFreePixmap(display, empty_bitmap); +} + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_x11_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ +#if X11_OPTIMIZED_SCREEN_UPDATE + static const lv_area_t inv_area = { .x1 = 0xFFFF, + .x2 = 0, + .y1 = 0xFFFF, + .y2 = 0 + }; + static lv_area_t upd_area = inv_area; + + /* build display update area until lv_disp_flush_is_last */ + upd_area.x1 = MIN(upd_area.x1, area->x1); + upd_area.x2 = MAX(upd_area.x2, area->x2); + upd_area.y1 = MIN(upd_area.y1, area->y1); + upd_area.y2 = MAX(upd_area.y2, area->y2); +#endif // X11_OPTIMIZED_SCREEN_UPDATE + + for (lv_coord_t y = area->y1; y <= area->y2; y++) + { + uint32_t dst_offs = area->x1 + y * LV_HOR_RES; + uint32_t* dst_data = &((uint32_t*)ximage->data)[dst_offs]; + for (lv_coord_t x = area->x1; x <= area->x2; x++, color_p++, dst_data++) + { + *dst_data = lv_color_to32(*color_p); + } + } + + if (lv_disp_flush_is_last(disp_drv)) + { +#if X11_OPTIMIZED_SCREEN_UPDATE + /* refresh collected display update area only */ + lv_coord_t upd_w = upd_area.x2 - upd_area.x1 + 1; + lv_coord_t upd_h = upd_area.y2 - upd_area.y1 + 1; + XPutImage(display, window, gc, ximage, upd_area.x1, upd_area.y1, upd_area.x1, upd_area.y1, upd_w, upd_h); + /* invalidate collected area */ + upd_area = inv_area; +#else + /* refresh full display */ + XPutImage(display, window, gc, ximage, 0, 0, 0, 0, LV_HOR_RES, LV_VER_RES); +#endif + } + lv_disp_flush_ready(disp_drv); +} + +void lv_x11_get_pointer(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + (void) indev_drv; // Unused + + data->point = mouse_pos; + data->state = left_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + +} + +void lv_x11_get_mousewheel(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + (void) indev_drv; // Unused + + data->state = wheel_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->enc_diff = wheel_cnt; + wheel_cnt = 0; +} + +void lv_x11_get_keyboard(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + (void) indev_drv; // Unused + + size_t len = strlen(kb_buffer); + if (len > 0) + { + data->state = LV_INDEV_STATE_PRESSED; + data->key = kb_buffer[0]; + memmove(kb_buffer, kb_buffer + 1, len); + data->continue_reading = (len > 0); + } + else + { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +void lv_x11_init(char const* title, lv_coord_t width, lv_coord_t height) +{ + /* setup display/screen */ + display = XOpenDisplay(NULL); + int screen = DefaultScreen(display); + + /* drawing contexts for an window */ + unsigned long myforeground = BlackPixel(display, screen); + unsigned long mybackground = WhitePixel(display, screen); + + /* create window */ + window = XCreateSimpleWindow(display, DefaultRootWindow(display), + 0, 0, width, height, + 0, myforeground, mybackground); + + /* window manager properties (yes, use of StdProp is obsolete) */ + XSetStandardProperties(display, window, title, NULL, None, NULL, 0, NULL); + + /* allow receiving mouse and keyboard events */ + XSelectInput(display, window, PointerMotionMask|ButtonPressMask|ButtonReleaseMask|KeyPressMask|KeyReleaseMask|ExposureMask); + + /* graphics context */ + gc = XCreateGC(display, window, 0, 0); + + lv_x11_hide_cursor(); + + /* create cache XImage */ + Visual* visual = XDefaultVisual(display, screen); + int dplanes = DisplayPlanes(display, screen); + ximage = XCreateImage(display, visual, dplanes, ZPixmap, 0, + malloc(width * height * sizeof(uint32_t)), width, height, 32, 0); + + timer = lv_timer_create(x11_event_handler, 10, NULL); + + /* finally bring window on top of the other windows */ + XMapRaised(display, window); +} + +void lv_x11_deinit(void) +{ + lv_timer_del(timer); + + free(ximage->data); + + XDestroyImage(ximage); + ximage = NULL; + + XFreeGC(display, gc); + gc = NULL; + XDestroyWindow(display, window); + window = (XID)-1; + + XCloseDisplay(display); + display = NULL; +} + +#endif // USE_X11 diff --git a/lib/lv_drivers/x11/x11.h b/lib/lv_drivers/x11/x11.h new file mode 100644 index 0000000..89d6475 --- /dev/null +++ b/lib/lv_drivers/x11/x11.h @@ -0,0 +1,60 @@ +/** + * @file x11.h + * + */ + +#ifndef X11_H +#define X11_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifndef LV_DRV_NO_CONF + #ifdef LV_CONF_INCLUDE_SIMPLE + #include "lv_drv_conf.h" + #else + #include "../../lv_drv_conf.h" + #endif +#endif + +#if USE_X11 + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_x11_init(char const* title, lv_coord_t width, lv_coord_t height); +void lv_x11_deinit(void); +void lv_x11_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); +void lv_x11_get_pointer(lv_indev_drv_t *indev_drv, lv_indev_data_t *data); +void lv_x11_get_mousewheel(lv_indev_drv_t *indev_drv, lv_indev_data_t *data); +void lv_x11_get_keyboard(lv_indev_drv_t *indev_drv, lv_indev_data_t *data); + +/********************** + * MACROS + **********************/ + +#endif /* USE_X11 */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* X11_H */ diff --git a/lib/lvgl/.github/workflows/build_micropython.yml b/lib/lvgl/.github/workflows/build_micropython.yml index dbad36c..a8bb912 100644 --- a/lib/lvgl/.github/workflows/build_micropython.yml +++ b/lib/lvgl/.github/workflows/build_micropython.yml @@ -8,7 +8,7 @@ jobs: build: if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} name: Build ${{ matrix.port }} port - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 continue-on-error: true strategy: matrix: @@ -23,7 +23,7 @@ jobs: - name: Clone lv_micropython run: | git clone https://github.com/lvgl/lv_micropython.git . - git checkout master + git checkout release/v8 - name: Initialize lv_bindings submodule run: git submodule update --init --recursive lib/lv_bindings - name: Update ${{ matrix.port }} port submodules diff --git a/lib/lvgl/.github/workflows/esp_upload_component.yml b/lib/lvgl/.github/workflows/esp_upload_component.yml index cb017c7..08edfe2 100644 --- a/lib/lvgl/.github/workflows/esp_upload_component.yml +++ b/lib/lvgl/.github/workflows/esp_upload_component.yml @@ -1,23 +1,23 @@ -name: Push LVGL release to Espressif Component Service - -# If the commit is tagged, it will be uploaded. Other scenario silently fail. -on: - push: - branches: - - master - -jobs: - upload_components: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - with: - submodules: "recursive" - - - name: Upload component to component registry - uses: espressif/github-actions/upload_components@master - with: - name: "lvgl" - version: "git" - namespace: "lvgl" - api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }} +name: Push LVGL release to Espressif Component Service + +# If the commit is tagged, it will be uploaded. Other scenario silently fail. +on: + push: + tags: + - v* + +jobs: + upload_components: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: "recursive" + + - name: Upload component to component registry + uses: espressif/upload-components-ci-action@v1 + with: + name: "lvgl" + version: ${{ github.ref_name }} + namespace: "lvgl" + api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }} diff --git a/lib/lvgl/Kconfig b/lib/lvgl/Kconfig index 76e86c5..4e9a13b 100644 --- a/lib/lvgl/Kconfig +++ b/lib/lvgl/Kconfig @@ -42,11 +42,9 @@ menu "LVGL configuration" config LV_COLOR_SCREEN_TRANSP bool "Enable more complex drawing routines to manage screens transparency." - depends on LV_COLOR_DEPTH_32 help Can be used if the UI is above another layer, e.g. an OSD menu or video player. - Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to - non LV_OPA_COVER value + The screen's `bg_opa` should be set to non LV_OPA_COVER value config LV_COLOR_MIX_ROUND_OFS int "Adjust color mix functions rounding" @@ -230,6 +228,16 @@ menu "LVGL configuration" Must be defined to include path of CMSIS header of target processor e.g. "stm32f769xx.h" or "stm32f429xx.h" + config LV_USE_GPU_RA6M3_G2D + bool "Enable RA6M3 G2D GPU." + config LV_GPU_RA6M3_G2D_INCLUDE + string "include path of target processor" + depends on LV_USE_GPU_RA6M3_G2D + default "hal_data.h" + help + Must be defined to include path of target processor + e.g. "hal_data.h" + config LV_USE_GPU_SWM341_DMA2D bool "Enable SWM341 DMA2D GPU." config LV_GPU_SWM341_DMA2D_INCLUDE @@ -913,7 +921,8 @@ menu "LVGL configuration" string "Set the working directory" depends on LV_USE_FS_STDIO config LV_FS_STDIO_CACHE_SIZE - string ">0 to cache this number of bytes in lv_fs_read()" + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 depends on LV_USE_FS_STDIO config LV_USE_FS_POSIX @@ -955,6 +964,17 @@ menu "LVGL configuration" default 0 depends on LV_USE_FS_FATFS + config LV_USE_FS_LITTLEFS + bool "File system on top of LittleFS" + config LV_FS_LITTLEFS_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_LITTLEFS + config LV_FS_LITTLEFS_CACHE_SIZE + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 + depends on LV_USE_FS_LITTLEFS + config LV_USE_PNG bool "PNG decoder library" @@ -991,6 +1011,13 @@ menu "LVGL configuration" endmenu endif + config LV_USE_TINY_TTF + bool "Tiny TTF library" + config LV_TINY_TTF_FILE_SUPPORT + bool "Load TTF data from files" + depends on LV_USE_TINY_TTF + default n + config LV_USE_RLOTTIE bool "Lottie library" diff --git a/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c b/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c index 810c094..7d93948 100644 --- a/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c +++ b/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c @@ -1,9 +1,4 @@ -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) -#include "lvgl.h" -#else -#include "lvgl/lvgl.h" -#endif - +#include "../../../lvgl.h" #ifndef LV_ATTRIBUTE_MEM_ALIGN #define LV_ATTRIBUTE_MEM_ALIGN diff --git a/lib/lvgl/demos/benchmark/lv_demo_benchmark.c b/lib/lvgl/demos/benchmark/lv_demo_benchmark.c index 44f3e8f..63e30ba 100644 --- a/lib/lvgl/demos/benchmark/lv_demo_benchmark.c +++ b/lib/lvgl/demos/benchmark/lv_demo_benchmark.c @@ -89,7 +89,7 @@ LV_FONT_DECLARE(lv_font_benchmark_montserrat_16_compr_az); LV_FONT_DECLARE(lv_font_benchmark_montserrat_28_compr_az); static void monitor_cb(lv_disp_drv_t * drv, uint32_t time, uint32_t px); -static void scene_next_task_cb(lv_timer_t * timer); +static void next_scene_timer_cb(lv_timer_t * timer); static void rect_create(lv_style_t * style); static void img_create(lv_style_t * style, const void * src, bool rotate, bool zoom, bool aa); static void txt_create(lv_style_t * style); @@ -636,7 +636,7 @@ static lv_obj_t * scene_bg; static lv_obj_t * title; static lv_obj_t * subtitle; static uint32_t rnd_act; - +static lv_timer_t * next_scene_timer; static const uint32_t rnd_map[] = { 0xbd13204f, 0x67d8167f, 0x20211c99, 0xb0a7cc05, @@ -708,9 +708,21 @@ void lv_demo_benchmark(void) benchmark_init(); /*Manually start scenes*/ - scene_next_task_cb(NULL); + next_scene_timer_cb(NULL); } +void lv_demo_benchmark_close(void) +{ + if(next_scene_timer) lv_timer_del(next_scene_timer); + next_scene_timer = NULL; + + lv_anim_del(NULL, NULL); + + lv_style_reset(&style_common); + + lv_obj_clean(lv_scr_act()); + +} void lv_demo_benchmark_run_scene(int_fast16_t scene_no) { @@ -725,7 +737,8 @@ void lv_demo_benchmark_run_scene(int_fast16_t scene_no) scene_act = scene_no >> 1; if(scenes[scene_act].create_cb) { - lv_label_set_text_fmt(title, "%"LV_PRId32"/%d: %s%s", scene_act * 2 + (opa_mode ? 1 : 0), (int)(dimof(scenes) * 2) - 2, + lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0), + (int32_t)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : ""); lv_label_set_text(subtitle, ""); @@ -972,11 +985,13 @@ static void report_cb(lv_timer_t * timer) } } -static void scene_next_task_cb(lv_timer_t * timer) +static void next_scene_timer_cb(lv_timer_t * timer) { LV_UNUSED(timer); lv_obj_clean(scene_bg); + next_scene_timer = NULL; + if(opa_mode) { if(scene_act >= 0) { if(scenes[scene_act].time_sum_opa == 0) scenes[scene_act].time_sum_opa = 1; @@ -995,8 +1010,8 @@ static void scene_next_task_cb(lv_timer_t * timer) } if(scenes[scene_act].create_cb) { - lv_label_set_text_fmt(title, "%"LV_PRId32"/%d: %s%s", scene_act * 2 + (opa_mode ? 1 : 0), - (int)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : ""); + lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0), + (int32_t)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : ""); if(opa_mode) { lv_label_set_text_fmt(subtitle, "Result of \"%s\": %"LV_PRId32" FPS", scenes[scene_act].name, scenes[scene_act].fps_normal); @@ -1013,8 +1028,8 @@ static void scene_next_task_cb(lv_timer_t * timer) rnd_reset(); scenes[scene_act].create_cb(); - lv_timer_t * t = lv_timer_create(scene_next_task_cb, SCENE_TIME, NULL); - lv_timer_set_repeat_count(t, 1); + next_scene_timer = lv_timer_create(next_scene_timer_cb, SCENE_TIME, NULL); + lv_timer_set_repeat_count(next_scene_timer, 1); } /*Ready*/ diff --git a/lib/lvgl/demos/benchmark/lv_demo_benchmark.h b/lib/lvgl/demos/benchmark/lv_demo_benchmark.h index 6a0a4f6..71a7589 100644 --- a/lib/lvgl/demos/benchmark/lv_demo_benchmark.h +++ b/lib/lvgl/demos/benchmark/lv_demo_benchmark.h @@ -30,6 +30,8 @@ typedef void finished_cb_t(void); **********************/ void lv_demo_benchmark(void); +void lv_demo_benchmark_close(void); + void lv_demo_benchmark_run_scene(int_fast16_t scene_no); void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb); diff --git a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c index fdb9b94..0f4006e 100644 --- a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c +++ b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c @@ -46,8 +46,11 @@ static lv_obj_t * t2; void lv_demo_keypad_encoder(void) { - g = lv_group_create(); - lv_group_set_default(g); + g = lv_group_get_default(); + if(g == NULL) { + g = lv_group_create(); + lv_group_set_default(g); + } lv_indev_t * cur_drv = NULL; for(;;) { @@ -76,6 +79,12 @@ void lv_demo_keypad_encoder(void) msgbox_create(); } +void lv_demo_keypad_encoder_close(void) +{ + lv_obj_clean(lv_scr_act()); + lv_obj_clean(lv_layer_top()); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h index c509d66..1916670 100644 --- a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h +++ b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h @@ -27,6 +27,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ void lv_demo_keypad_encoder(void); +void lv_demo_keypad_encoder_close(void); /********************** * MACROS diff --git a/lib/lvgl/demos/music/lv_demo_music.c b/lib/lvgl/demos/music/lv_demo_music.c index cb72ed1..7393dfd 100644 --- a/lib/lvgl/demos/music/lv_demo_music.c +++ b/lib/lvgl/demos/music/lv_demo_music.c @@ -103,6 +103,12 @@ static const uint32_t time_list[] = { 2 * 60 + 19, }; +#if LV_DEMO_MUSIC_AUTO_PLAY + static lv_timer_t * auto_step_timer; +#endif + +static lv_color_t original_screen_bg_color; + /********************** * MACROS **********************/ @@ -113,14 +119,31 @@ static const uint32_t time_list[] = { void lv_demo_music(void) { + original_screen_bg_color = lv_obj_get_style_bg_color(lv_scr_act(), 0); lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x343247), 0); list = _lv_demo_music_list_create(lv_scr_act()); ctrl = _lv_demo_music_main_create(lv_scr_act()); #if LV_DEMO_MUSIC_AUTO_PLAY - lv_timer_create(auto_step_cb, 1000, NULL); + auto_step_timer = lv_timer_create(auto_step_cb, 1000, NULL); +#endif +} + +void lv_demo_music_close(void) +{ + /*Delete all aniamtions*/ + lv_anim_del(NULL, NULL); + +#if LV_DEMO_MUSIC_AUTO_PLAY + lv_timer_del(auto_step_timer); #endif + _lv_demo_music_list_close(); + _lv_demo_music_main_close(); + + lv_obj_clean(lv_scr_act()); + + lv_obj_set_style_bg_color(lv_scr_act(), original_screen_bg_color, 0); } const char * _lv_demo_music_get_title(uint32_t track_id) diff --git a/lib/lvgl/demos/music/lv_demo_music.h b/lib/lvgl/demos/music/lv_demo_music.h index 82917fb..3c393d6 100644 --- a/lib/lvgl/demos/music/lv_demo_music.h +++ b/lib/lvgl/demos/music/lv_demo_music.h @@ -36,6 +36,8 @@ extern "C" { **********************/ void lv_demo_music(void); +void lv_demo_music_close(void); + const char * _lv_demo_music_get_title(uint32_t track_id); const char * _lv_demo_music_get_artist(uint32_t track_id); const char * _lv_demo_music_get_genre(uint32_t track_id); diff --git a/lib/lvgl/demos/music/lv_demo_music_list.c b/lib/lvgl/demos/music/lv_demo_music_list.c index 88e79ec..942baeb 100644 --- a/lib/lvgl/demos/music/lv_demo_music_list.c +++ b/lib/lvgl/demos/music/lv_demo_music_list.c @@ -130,6 +130,19 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent) return list; } + +void _lv_demo_music_list_close(void) +{ + lv_style_reset(&style_scrollbar); + lv_style_reset(&style_btn); + lv_style_reset(&style_btn_pr); + lv_style_reset(&style_btn_chk); + lv_style_reset(&style_btn_dis); + lv_style_reset(&style_title); + lv_style_reset(&style_artist); + lv_style_reset(&style_time); +} + void _lv_demo_music_list_btn_check(uint32_t track_id, bool state) { lv_obj_t * btn = lv_obj_get_child(list, track_id); diff --git a/lib/lvgl/demos/music/lv_demo_music_list.h b/lib/lvgl/demos/music/lv_demo_music_list.h index 48e6e17..d03c6d1 100644 --- a/lib/lvgl/demos/music/lv_demo_music_list.h +++ b/lib/lvgl/demos/music/lv_demo_music_list.h @@ -28,6 +28,8 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent); +void _lv_demo_music_list_close(void); + void _lv_demo_music_list_btn_check(uint32_t track_id, bool state); /********************** diff --git a/lib/lvgl/demos/music/lv_demo_music_main.c b/lib/lvgl/demos/music/lv_demo_music_main.c index f7bc4b8..e30acde 100644 --- a/lib/lvgl/demos/music/lv_demo_music_main.c +++ b/lib/lvgl/demos/music/lv_demo_music_main.c @@ -60,7 +60,7 @@ static void prev_click_event_cb(lv_event_t * e); static void next_click_event_cb(lv_event_t * e); static void timer_cb(lv_timer_t * t); static void track_load(uint32_t id); -static void stop_start_anim(lv_timer_t * t); +static void stop_start_anim_timer_cb(lv_timer_t * t); static void spectrum_end_cb(lv_anim_t * a); static void album_fade_anim_cb(void * var, int32_t v); static int32_t get_cos(int32_t deg, int32_t a); @@ -84,6 +84,7 @@ static uint32_t spectrum_lane_ofs_start = 0; static uint32_t bar_rot = 0; static uint32_t time_act; static lv_timer_t * sec_counter_timer; +static lv_timer_t * stop_start_anim_timer; static const lv_font_t * font_small; static const lv_font_t * font_large; static uint32_t track_id; @@ -232,8 +233,8 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent) start_anim = true; - lv_timer_t * timer = lv_timer_create(stop_start_anim, INTRO_TIME + 6000, NULL); - lv_timer_set_repeat_count(timer, 1); + stop_start_anim_timer = lv_timer_create(stop_start_anim_timer_cb, INTRO_TIME + 6000, NULL); + lv_timer_set_repeat_count(stop_start_anim_timer, 1); lv_anim_init(&a); lv_anim_set_path_cb(&a, lv_anim_path_bounce); @@ -292,6 +293,12 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent) return main_cont; } +void _lv_demo_music_main_close(void) +{ + if(stop_start_anim_timer) lv_timer_del(stop_start_anim_timer); + lv_timer_del(sec_counter_timer); +} + void _lv_demo_music_album_next(bool next) { uint32_t id = track_id; @@ -762,7 +769,7 @@ static void spectrum_draw_event_cb(lv_event_t * e) lv_obj_t * obj = lv_event_get_target(e); lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); - lv_opa_t opa = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); if(opa < LV_OPA_MIN) return; lv_point_t poly[4]; @@ -990,10 +997,11 @@ static void spectrum_end_cb(lv_anim_t * a) } -static void stop_start_anim(lv_timer_t * t) +static void stop_start_anim_timer_cb(lv_timer_t * t) { LV_UNUSED(t); start_anim = false; + stop_start_anim_timer = NULL; lv_obj_refresh_ext_draw_size(spectrum_obj); } diff --git a/lib/lvgl/demos/music/lv_demo_music_main.h b/lib/lvgl/demos/music/lv_demo_music_main.h index a2cf939..04e8a7f 100644 --- a/lib/lvgl/demos/music/lv_demo_music_main.h +++ b/lib/lvgl/demos/music/lv_demo_music_main.h @@ -28,6 +28,8 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent); +void _lv_demo_music_main_close(void); + void _lv_demo_music_play(uint32_t id); void _lv_demo_music_resume(void); void _lv_demo_music_pause(void); diff --git a/lib/lvgl/demos/stress/lv_demo_stress.c b/lib/lvgl/demos/stress/lv_demo_stress.c index b247443..24a9534 100644 --- a/lib/lvgl/demos/stress/lv_demo_stress.c +++ b/lib/lvgl/demos/stress/lv_demo_stress.c @@ -25,7 +25,7 @@ static void msgbox_del(lv_timer_t * tmr); static void set_y_anim(void * obj, int32_t v); static void set_width_anim(void * obj, int32_t v); static void arc_set_end_angle_anim(void * obj, int32_t v); -static void obj_test_task_cb(lv_timer_t * tmr); +static void obj_test_timer_cb(lv_timer_t * tmr); /********************** * STATIC VARIABLES @@ -34,6 +34,10 @@ static lv_obj_t * main_page; static lv_obj_t * ta; static const char * mbox_btns[] = {"Ok", "Cancel", ""}; static uint32_t mem_free_start = 0; +static lv_timer_t * obj_test_timer; +static int16_t state; +static lv_timer_t * msgbox_tmr; + /********************** * MACROS **********************/ @@ -45,23 +49,34 @@ static uint32_t mem_free_start = 0; void lv_demo_stress(void) { LV_LOG_USER("Starting stress test. (< 100 bytes permanent memory leak is normal due to fragmentation)"); - lv_timer_create(obj_test_task_cb, LV_DEMO_STRESS_TIME_STEP, NULL); + obj_test_timer = lv_timer_create(obj_test_timer_cb, LV_DEMO_STRESS_TIME_STEP, NULL); + state = -1; +} + +void lv_demo_stress_close(void) +{ + lv_timer_del(obj_test_timer); + obj_test_timer = NULL; + if(msgbox_tmr) { + lv_timer_del(msgbox_tmr); + msgbox_tmr = NULL; + } + + lv_obj_clean(lv_scr_act()); + lv_obj_clean(lv_layer_top()); } /********************** * STATIC FUNCTIONS **********************/ -static void obj_test_task_cb(lv_timer_t * tmr) +static void obj_test_timer_cb(lv_timer_t * tmr) { (void) tmr; /*Unused*/ - static int16_t state = -1; lv_anim_t a; lv_obj_t * obj; - // printf("step start: %d\n", state); - switch(state) { case -1: { lv_res_t res = lv_mem_test(); @@ -246,8 +261,7 @@ static void obj_test_task_cb(lv_timer_t * tmr) case 14: obj = lv_msgbox_create(NULL, "Title", "Some text on the message box with average length", mbox_btns, true); - - lv_timer_t * msgbox_tmr = lv_timer_create(msgbox_del, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj); + msgbox_tmr = lv_timer_create(msgbox_del, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj); lv_timer_set_repeat_count(msgbox_tmr, 1); lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 0); break; @@ -439,6 +453,7 @@ static void auto_del(lv_obj_t * obj, uint32_t delay) static void msgbox_del(lv_timer_t * tmr) { + msgbox_tmr = NULL; lv_msgbox_close(tmr->user_data); } diff --git a/lib/lvgl/demos/stress/lv_demo_stress.h b/lib/lvgl/demos/stress/lv_demo_stress.h index f718366..aacc9e1 100644 --- a/lib/lvgl/demos/stress/lv_demo_stress.h +++ b/lib/lvgl/demos/stress/lv_demo_stress.h @@ -30,6 +30,8 @@ extern "C" { **********************/ void lv_demo_stress(void); +void lv_demo_stress_close(void); + /********************** * MACROS **********************/ diff --git a/lib/lvgl/demos/widgets/lv_demo_widgets.c b/lib/lvgl/demos/widgets/lv_demo_widgets.c index 839b999..44567e4 100644 --- a/lib/lvgl/demos/widgets/lv_demo_widgets.c +++ b/lib/lvgl/demos/widgets/lv_demo_widgets.c @@ -86,6 +86,8 @@ static uint32_t session_desktop = 1000; static uint32_t session_tablet = 1000; static uint32_t session_mobile = 1000; +static lv_timer_t * meter2_timer; + /********************** * MACROS **********************/ @@ -196,6 +198,22 @@ void lv_demo_widgets(void) color_changer_create(tv); } +void lv_demo_widgets_close(void) +{ + /*Delete all animation*/ + lv_anim_del(NULL, NULL); + + lv_timer_del(meter2_timer); + meter2_timer = NULL; + + lv_obj_clean(lv_scr_act()); + + lv_style_reset(&style_text_muted); + lv_style_reset(&style_title); + lv_style_reset(&style_icon); + lv_style_reset(&style_bullet); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -205,6 +223,7 @@ static void profile_create(lv_obj_t * parent) lv_obj_t * panel1 = lv_obj_create(parent); lv_obj_set_height(panel1, LV_SIZE_CONTENT); + LV_IMG_DECLARE(img_demo_widgets_avatar); lv_obj_t * avatar = lv_img_create(panel1); lv_img_set_src(avatar, &img_demo_widgets_avatar); @@ -698,7 +717,7 @@ static void analytics_create(lv_obj_t * parent) lv_meter_set_indicator_start_value(meter2, meter2_indic[2], 70); lv_meter_set_indicator_end_value(meter2, meter2_indic[2], 99); - lv_timer_create(meter2_timer_cb, 100, meter2_indic); + meter2_timer = lv_timer_create(meter2_timer_cb, 100, meter2_indic); meter3 = create_meter_box(parent, "Network Speed", "Low speed", "Normal Speed", "High Speed"); if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter3), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); diff --git a/lib/lvgl/demos/widgets/lv_demo_widgets.h b/lib/lvgl/demos/widgets/lv_demo_widgets.h index 66dddaf..8d70df1 100644 --- a/lib/lvgl/demos/widgets/lv_demo_widgets.h +++ b/lib/lvgl/demos/widgets/lv_demo_widgets.h @@ -27,6 +27,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ void lv_demo_widgets(void); +void lv_demo_widgets_close(void); /********************** * MACROS diff --git a/lib/lvgl/docs/CHANGELOG.md b/lib/lvgl/docs/CHANGELOG.md index 4839ce6..8349623 100644 --- a/lib/lvgl/docs/CHANGELOG.md +++ b/lib/lvgl/docs/CHANGELOG.md @@ -1,5 +1,328 @@ # Changelog +## [v8.3.11](https://github.com/lvgl/lvgl/compare/v8.3.11...v8.3.10) 6 December 2023 + +### New Features + +- feat(table): add user_data to table cells [`4767`](https://github.com/lvgl/lvgl/pull/4767) +- feat(tiny_ttf): backport Tiny TTF to lvgl 8 [`4727`](https://github.com/lvgl/lvgl/pull/4727) +- feat(littlefs): add lv_fs_littlefs system as a driver [`4677`](https://github.com/lvgl/lvgl/pull/4677) + +### Fixes + +- fix(obj): readjust scroll after layout when child removed [`4921`](https://github.com/lvgl/lvgl/pull/4921) +- fix(rt-thread): fix create lvgl thread problem [`4862`](https://github.com/lvgl/lvgl/pull/4862) +- fix(obj): fix arduino compile warnings [`4807`](https://github.com/lvgl/lvgl/pull/4807) +- fix(table):fix issue with abnormal string output of 'lv_table_set_cell_value_fmt' [`4804`](https://github.com/lvgl/lvgl/pull/4804) +- fix(table) user data API functions renamed [`4769`](https://github.com/lvgl/lvgl/pull/4769) +- fix(ime_pinyin): keep cursor in the textarea when a candidate is pressed [`4731`](https://github.com/lvgl/lvgl/pull/4731) +- fix(draw_needles): changed needle line draw start point from scale ce… [`4682`](https://github.com/lvgl/lvgl/pull/4682) +- fix(arc): handle click outside background angle range (#4586) [`4667`](https://github.com/lvgl/lvgl/pull/4667) +- fix(meter): fix minor issues [`4657`](https://github.com/lvgl/lvgl/pull/4657) +- fix(draw): fix compiler error in lv_draw_sw_transform.c #2 [`4612`](https://github.com/lvgl/lvgl/pull/4612) +- fix(dropdown): avoid partial match in lv_dropdown_get_option_index [`4598`](https://github.com/lvgl/lvgl/pull/4598) +- fix(dropdown): reset char_i = 0, avoid access overflow [`4589`](https://github.com/lvgl/lvgl/pull/4589) +- fix(btnmatrix): set LV_BTNMATRIX_BTN_NONE when clicking of disabled button (#4571) [`4578`](https://github.com/lvgl/lvgl/pull/4578) +- fix(qrcode): use LV_ASSERT instead of assert [`1840dec`](https://github.com/lvgl/lvgl/commit/1840decb4136ba01552fcb7cedb0ff759824e2fd) +- fix: fix warning in lv_draw_sw_letter.c [`d22cda3`](https://github.com/lvgl/lvgl/commit/d22cda3cdb15cee95763491db95753980846d9f9) +- fix(arc): fix setting value by click [`20b6199`](https://github.com/lvgl/lvgl/commit/20b6199ba90319942c3cd91f2c727da6cd40cd2d) +- fix(disp): fix infinite recursive SCREEN_LOADED events [`ef76206`](https://github.com/lvgl/lvgl/commit/ef76206c75ea9de26407534a9ce1079dc8e750e3) +- fix(keyboard): add '&' character [`d20bd1c`](https://github.com/lvgl/lvgl/commit/d20bd1ca397ff954167dd496cf1a78da8814f602) +- fix(draw): fix scaling rectangle parts with opa [`7a8fcbf`](https://github.com/lvgl/lvgl/commit/7a8fcbfd3458739cbe64b29767a969ece9542039) + +### Docs + +- docs(obj): fix wording [`4625`](https://github.com/lvgl/lvgl/pull/4625) +- docs(label): update text for recoloring [`4606`](https://github.com/lvgl/lvgl/pull/4606) +- docs: fix typo [`9fbac75`](https://github.com/lvgl/lvgl/commit/9fbac7570bdec18ddbb157b59f5e26a2ebdf5daf) + +### Others + +- chore(cmsis-pack): prepare for v8.3.11 [`4936`](https://github.com/lvgl/lvgl/pull/4936) +- chore(cmake): add support for user-specified lv_conf.h path [`4689`](https://github.com/lvgl/lvgl/pull/4689) +- STM32U5 DMA2D support (8.3) [`4643`](https://github.com/lvgl/lvgl/pull/4643) +- backport: fix(lv_disp): fix lv_scr_load_anim being called twice quickly [`4629`](https://github.com/lvgl/lvgl/pull/4629) +- chore(lv_draw_sw_letter.c): Fix print format [`4615`](https://github.com/lvgl/lvgl/pull/4615) +- chore: fix compile error [`7568df7`](https://github.com/lvgl/lvgl/commit/7568df77d16ecbf2242b2bc290dc8fc0eb29cf5a) + +## [v8.3.10](https://github.com/lvgl/lvgl/compare/v8.3.10...v8.3.9) 20 September 2023 + +### New Features + +- feat(disp): add double buffered direct-mode efficient sync algorithm (v8.3) [`4497`](https://github.com/lvgl/lvgl/pull/4497) +- feat(style): backport opa_layered [`6548ea0`](https://github.com/lvgl/lvgl/commit/6548ea0f291be8a97afb3c4d7dcabbe465ae5a04) + + +### Fixes + +- fix: build on Windows (MinGW environment) [`4538`](https://github.com/lvgl/lvgl/pull/4538) +- fix(docs): dropdown: fix function name in description of static options [`4535`](https://github.com/lvgl/lvgl/pull/4535) +- fix: do not copy invalid areas if not double buffered mode [`4526`](https://github.com/lvgl/lvgl/pull/4526) +- fix(sdl): add missing parameter in lv_draw_sdl_composite_texture_obtain [`4490`](https://github.com/lvgl/lvgl/pull/4490) +- fix(dropdown): position to the selected item in lv_dropdown_set_selected [`f174589`](https://github.com/lvgl/lvgl/commit/f174589240b099a349e54ba09aa9b39c2b347341) +- fix(vglite): be sure end_angle > start_angle in arc drawing [`01cd1fe`](https://github.com/lvgl/lvgl/commit/01cd1fed9db974aa616a6289a29171b7a971cd89) +- fix(btnmatrix): fix tapping just outside a button in a buttonmatrix [`8063fac`](https://github.com/lvgl/lvgl/commit/8063fac793b0a09add1e57c1115b734659274e6f) + + +### Docs + +- docs(calendar): update according to v8.2 changes [`a296456`](https://github.com/lvgl/lvgl/commit/a296456591f6ff0e3b3ae6cdcdd9ec5b1711c357) +- docs(simulator): remove SDL support from the Visual Studio project [`bcebafe`](https://github.com/lvgl/lvgl/commit/bcebafe4fb72e336b7dedca89c07e334427eef8d) + +### CI and tests + +- ci: update screenshot compare from v9 to automatically create missing reference images [`fd21ed0`](https://github.com/lvgl/lvgl/commit/fd21ed0eb82bacb1e482180ab0aaed6a667f000d) +- ci(dropdown): fix test [`5fc488a`](https://github.com/lvgl/lvgl/commit/5fc488a088639dbfb5eb44f65b05e13b6ba881bf) + +### Others + +- chore(cmsis-pack): create cmsis-pack for v8.3.10 [`4572`](https://github.com/lvgl/lvgl/pull/4572) +- Update screen object opacity function documentation [`4505`](https://github.com/lvgl/lvgl/pull/4505) +- demo(sress): fix issues when the stress test is opened/clsoed multiple times [`1c5df6c`](https://github.com/lvgl/lvgl/commit/1c5df6c665b0d5f6f346d45b13109ff1f6ea78a6) +- chore: code formatting [`eb87767`](https://github.com/lvgl/lvgl/commit/eb87767cc65fec93f9cc4f87a1f8fb5b32f7e41d) + + +## [v8.3.9](https://github.com/lvgl/lvgl/compare/v8.3.9...v8.3.8) 6 August 2023 + + +### Fixes + +- fix(decoder): fix LV_IMG_CF_ALPHA_8BIT bin file decoder [`4406`](https://github.com/lvgl/lvgl/pull/4406) +- fix(config): fix typo in LV_USE_PERF_MONITOR and LV_USE_MEM_MONITOR [`4403`](https://github.com/lvgl/lvgl/pull/4403) +- fix(attr): refactor LV_ATTRIBUTE_* for function attributes [`4404`](https://github.com/lvgl/lvgl/pull/4404) +- fix(font): fix optimizer issue in lv_font_fmt_txt.c [`4385`](https://github.com/lvgl/lvgl/pull/4385) +- fix(btnmatrix): Hide button matrix when all buttons hidden [`65f1c93`](https://github.com/lvgl/lvgl/commit/65f1c9305e1b13356010524da4764fe20fe93030) +- fix(obj) prevent hidden objects keeping focus [`375b3b5`](https://github.com/lvgl/lvgl/commit/375b3b5d3ef2ea8c52f971a1bf20998be7940d5e) +- fix(btnmatrix): Fix typo in previous commit! [`29ed7c5`](https://github.com/lvgl/lvgl/commit/29ed7c5717f6cfbca5ce888bf4497221525aae85) +- fix(tabview): fix warning [`223dc1c`](https://github.com/lvgl/lvgl/commit/223dc1cf9d1cad0f40caf244eb435af0871f4153) +- fix(indev): fix warnings when loggin coordinates is enabled [`645006e`](https://github.com/lvgl/lvgl/commit/645006e35195cab3354f34a1a8cbc8c5ed0fdfad) +- fix: use const lv_img_dsc_t * dsc function parameter in lv_img_buf.h/ [`4f102d7`](https://github.com/lvgl/lvgl/commit/4f102d7b6b2e9f9fa68ab7b976d93762107549a4) +- fix(chart): fix lv_chart_get_point_pos_by_id [`f9ffcc9`](https://github.com/lvgl/lvgl/commit/f9ffcc9d8e11beb369dcbab0945ca85eab8f77b2) +- fix(imgbtn): support LV_OBJ_FLAG_CHECKABLE [`385d999`](https://github.com/lvgl/lvgl/commit/385d999a4a8164fcde6ae05f6a5daa5d5c209dd3) + + +### Docs + +- docs(disp): metined that rotation rotates the touch coordinates too [`810852b`](https://github.com/lvgl/lvgl/commit/810852b41be5df66fd7b80f8af69f8b579d142ea) + + +### Others + +- demos: add lv_demo_..._close() functions for each demo [`91038a9`](https://github.com/lvgl/lvgl/commit/91038a99e82a2522f693c7cdc77e9e7a672ee9ed) + + +## [v8.3.8](https://github.com/lvgl/lvgl/compare/v8.3.8...v8.3.7) 5 July 2023 + +### New Features + +- feat(rt-thread): make the rt-thread env recursively glob the UI files [`8b83fe7`](https://github.com/lvgl/lvgl/commit/8b83fe7ea53a597cdbae8204d0aa9be8ad3d2b89) + +### Performance + +- perf(pxp, vglite): improve performance and add more features [`4222`](https://github.com/lvgl/lvgl/pull/4222) + +### Fixes + +- fix(stm32): static function prototypes moved from .h to .c [`4276`](https://github.com/lvgl/lvgl/pull/4276) +- fix(png): fix decode image size and some warnings [`4248`](https://github.com/lvgl/lvgl/pull/4248) +- fix(bidi): add more Hebrew checks to RTL characters set (#4171) [`4239`](https://github.com/lvgl/lvgl/pull/4239) +- fix(img): fix getting the image type on big endian systems [`4215`](https://github.com/lvgl/lvgl/pull/4215) +- fix(sdl): destroy texture after use if not stored in cache [`4173`](https://github.com/lvgl/lvgl/pull/4173) + +- fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185 [`cb602ea`](https://github.com/lvgl/lvgl/commit/cb602ea7785de21a187ef5ee5f7de4e3aa3f7e0e) +- fix(arduino): fix messed up variable types [`e3659c4`](https://github.com/lvgl/lvgl/commit/e3659c46b128b2b715b196c3ccfb94b3de4c89f8) +- fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185 [`07bce74`](https://github.com/lvgl/lvgl/commit/07bce7466d471a15ba241a9db3239f7a116b0b46) +- fix(chart): fix division by zero if there are no ticks [`67b3011`](https://github.com/lvgl/lvgl/commit/67b3011f835b08c77ff60ae2d1e6592a710ca2b1) +- fix(msgbox): fix typo [`6a89bd2`](https://github.com/lvgl/lvgl/commit/6a89bd2d7409ac4d49ad32da73ba50a84f7c8990) +- fix(tabview): remove the animation if the tab is selected by clicking the button on the header [`3de61c7`](https://github.com/lvgl/lvgl/commit/3de61c76af0aed1665e9d61e47b4dd50b9e8bdf1) +- fix(btnmatrix): fix array out of bounds addressing with groups and no buttons [`edd5ad2`](https://github.com/lvgl/lvgl/commit/edd5ad28ad74d1025db0b442cfa390d8c01ae006) +- fix(btnmatrix): fix using > 7 as button width [`75e6ef4`](https://github.com/lvgl/lvgl/commit/75e6ef4e1d66a85d68160b97ef931b0717e77212) +- fix(draw): typo with LV_COLOR_DEPTH 8 [`45b13c3`](https://github.com/lvgl/lvgl/commit/45b13c378f6fc1728ddf1547c25daa61d62c9f76) +- fix(disp): fix memory leak lv_scr_load_anim with auto_del and time=0 [`1caafc5`](https://github.com/lvgl/lvgl/commit/1caafc55dde46e1b7e3d17d8c5349fbf7cccba9f) + +- fix(msgbox): add missing lv_obj_class_init_obj [`6843c19`](https://github.com/lvgl/lvgl/commit/6843c191b792f66829477827279adbbc763541c1) +- fix(flex): register LV_STYLE_FLEX_GROW [`5ba90a5`](https://github.com/lvgl/lvgl/commit/5ba90a5c41f584a8eb3a4fc8e2f466729652ddb3) + +### Examples + +- example(tabview): fix tabview disable scrollig example [`9491c3f`](https://github.com/lvgl/lvgl/commit/9491c3ff6d2f8e56b13d8fb493d4b3ee98ef1a4b) + +### Docs + +- docs: mention incompatibility between software rotation and `direct_mode` or `full_refresh` [`4308`](https://github.com/lvgl/lvgl/pull/4308) +- docs(faq): don't say 24 bit is support as LVGL can't render in RGB888 directly [`227ac02`](https://github.com/lvgl/lvgl/commit/227ac023419eeb253892b1c36113059f12b1f9f2) + +### CI and tests + +### Others + +- chore(cmsis-pack): update cmsis-pack for v8.3.8 [`4340`](https://github.com/lvgl/lvgl/pull/4340) +- add(docs): add renesas-ra6m3 get-started document [`4278`](https://github.com/lvgl/lvgl/pull/4278) +- add(gpu): add renesas-ra6m3 gpu adaptation [`4270`](https://github.com/lvgl/lvgl/pull/4270) + +- Revert "fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185" [`1713cd3`](https://github.com/lvgl/lvgl/commit/1713cd3fd8f93aa575fbcf0e34b8626b6ee69ded) + + + + +## [v8.3.7](https://github.com/lvgl/lvgl/compare/v8.3.7...v8.3.6) 3 May 2023 + +### New Features + +- feat(btnmatrix): review ctrl map and allow width values to be max 15 [`a150b15`](https://github.com/lvgl/lvgl/commit/a150b15e45a922eb5497fe5a31a480e1cd689246) + +### Fixes + +- fix (spinbox): doubling characters entered from the keyboard [`4190`](https://github.com/lvgl/lvgl/pull/4190) +- fix(arm-2d): fix transform-chrome-keying issue [`4178`](https://github.com/lvgl/lvgl/pull/4178) +- fix(menu): prevent setting the current page again [`4136`](https://github.com/lvgl/lvgl/pull/4136) +- fix(esp): fix ESP-IDF pedantic builds (backport v8.3) [`4135`](https://github.com/lvgl/lvgl/pull/4135) +- fix: color mixing with LV_COLOR_SWAP == 1 [`4101`](https://github.com/lvgl/lvgl/pull/4101) + +- fix(indev): fix integer overflow in recursive zoom calculation [`a0795b4`](https://github.com/lvgl/lvgl/commit/a0795b49e82102ad68a27c86c36c37fffbe66d3c) +- fix(style): fix trasition on bg_grad color [`48d7878`](https://github.com/lvgl/lvgl/commit/48d7878bac3f607322957ed6f710d6615d5e72e0) + + +## [v8.3.6](https://github.com/lvgl/lvgl/compare/v8.3.6...v8.3.5) 3 April 2023 + +### New Features + +- feat(msg): add lv_msg_unsubcribe_obj [`6af0179`](https://github.com/lvgl/lvgl/commit/6af01798d82f90f0c2ba6a9da39c4f10fb427df7) + +### Performance + +### Fixes + +- fix(group): fix default_group becomes wild pointer when deleted [`4076`](https://github.com/lvgl/lvgl/pull/4076) +- fix(fs_posix): allow creating new file and set permission. [`3976`](https://github.com/lvgl/lvgl/pull/3976) +- fix(img): support negative angles [`3846`](https://github.com/lvgl/lvgl/pull/3846) +- fix(gif): synchronize with master [`4003`](https://github.com/lvgl/lvgl/pull/4003) +- fix(gpu): fix STM GPU drivers for some variants [`4004`](https://github.com/lvgl/lvgl/pull/4004) +- fix(img): possible divide by 0 exception (lvgl#3988) [`3990`](https://github.com/lvgl/lvgl/pull/3990) +- fix(arc): fix knob area invalidation [`d0e19eb`](https://github.com/lvgl/lvgl/commit/d0e19eb2d38ba8a500399b0496d7a8363be4003e) +- fix(slider): consider animations on pressing [`0b7777f`](https://github.com/lvgl/lvgl/commit/0b7777f27a7932efe3d594be426e1beb59d80ae3) +- fix(bar): delete running animations when a new value is set without animation [`aa31380`](https://github.com/lvgl/lvgl/commit/aa313806d0ebde475fc2bc360a15172cc1b658a7) +- docs: use a fixed commit of lv_web_emscripten [`501230e`](https://github.com/lvgl/lvgl/commit/501230e0fc95936199b3187d350873c3bb4a94e4) + +### Examples + +### Docs + +- docs(arduino): add note to not use lv_examles library [`2f294aa`](https://github.com/lvgl/lvgl/commit/2f294aa76c8fece98a4fa72304bc6f267ed2a228) +- docs: use a fixed commit of lv_web_emscripten [`501230e`](https://github.com/lvgl/lvgl/commit/501230e0fc95936199b3187d350873c3bb4a94e4) + +### CI and tests + +### Others + +- chore(cmsis-pack): update cmsis-pack for v8.3.6 [`4108`](https://github.com/lvgl/lvgl/pull/4108) +- chore: update the version numbers to v8.3.5-dev [`77670fb`](https://github.com/lvgl/lvgl/commit/77670fb1a55e0f2012ff7a057e535830e7253e22) +- Update build_html_examples.sh [`399069b`](https://github.com/lvgl/lvgl/commit/399069b4a2423c11823581668fe71ce9a7c88e7d) + + +## [v8.3.5](https://github.com/lvgl/lvgl/compare/v8.3.4...v8.3.5) 7 February 2023 + +### Performance + +- perf(gpu): improve NXP's PXP and VGLite accelerators [`3952`](https://github.com/lvgl/lvgl/pull/3952) +- perf(dam2d): rework stm32 dma2d [`3904`](https://github.com/lvgl/lvgl/pull/3904) + +### Fixes + +- fix(monkey): remove executable permissions from source files [`3971`](https://github.com/lvgl/lvgl/pull/3971) +- fix(ci): set Ubuntu version for MicroPython test [`3865`](https://github.com/lvgl/lvgl/pull/3865) +- fix(Kconfig): fix wrong type of LV_FS_STDIO_CACHE_SIZE (v8.3) [`3906`](https://github.com/lvgl/lvgl/pull/3906) +- docs(indev): fix the name of long_press_repeat_time (was long_press_rep_time) [`34c545e`](https://github.com/lvgl/lvgl/commit/34c545ef19dc97c8952a412e533a4cd3924b9fbc) +- fix(roller): consider the recolor setting of the label [`39f4247`](https://github.com/lvgl/lvgl/commit/39f424767fa57376c4cb08cf22951fd56d854fd6) + +### Examples + +### Docs + +- docs(indev): fix the name of long_press_repeat_time (was long_press_rep_time) [`34c545e`](https://github.com/lvgl/lvgl/commit/34c545ef19dc97c8952a412e533a4cd3924b9fbc) + +### CI and tests + +- ci(esp): fix push to the component registry on tag [`e529230`](https://github.com/lvgl/lvgl/commit/e529230f4bb97b4506c430aac96d5ddaef685dc4) + +### Others + +- chore(cmsis-pack): update cmsis-pack for v8.3.5 [`3972`](https://github.com/lvgl/lvgl/pull/3972) +- chore: add an option to "LV_TICK_CUSTOM" [`3879`](https://github.com/lvgl/lvgl/pull/3879) + +- bump version numbers to v8.3.5-dev [`47c8f8f`](https://github.com/lvgl/lvgl/commit/47c8f8f9822f4c0c0ffbe2f12b380bddefcec475) +- Update layer.md [`9faca8a`](https://github.com/lvgl/lvgl/commit/9faca8a8d4125e21dedbf6e46aa1586a6b57e5b8) + +## [v8.3.4](https://github.com/lvgl/lvgl/compare/v8.3.4...v8.3.3) 15 December 2022 + +### New Features + +- feat(keyboard): ported arabic keyboard from release 7.10.0 [`3728`](https://github.com/lvgl/lvgl/pull/3728) +- feat(table): scroll to the selected cell with key navigation [`39d03a8`](https://github.com/lvgl/lvgl/commit/39d03a80f45847a1977cfe9cc6a509b1613d0aca) + +### Fixes + +- fix(rt-thread): sync rt-thread v5.0.0 rt_align [`3864`](https://github.com/lvgl/lvgl/pull/3864) +- fix(draw): SDL2 gradient support #3848 [`3856`](https://github.com/lvgl/lvgl/pull/3856) +- fix(esp.cmake): add demos and examples [`3784`](https://github.com/lvgl/lvgl/pull/3784) +- fix(indev): fix scrolling on transformed obejcts [`84cf05d`](https://github.com/lvgl/lvgl/commit/84cf05d8b23b31e000db757a278545e58fcbcbe8) +- fix(style): add the missing support for pct pivot in tranasform style properties [`c8e584f`](https://github.com/lvgl/lvgl/commit/c8e584f879a1e1427e7a8f5ff496af39f17df41d) +- fix(flex): be sure obj->w_layout and h_layout can't be set at the same time [`c4c4007`](https://github.com/lvgl/lvgl/commit/c4c400716e80a279e7b3d43b8992915fe94441eb) +- fix(chart): fix very dense bar charts [`bb2c2ac`](https://github.com/lvgl/lvgl/commit/bb2c2ac34ac943978513c7ed51885078979b1c10) +- fix(draw): handle LV_COLOR_DEPTH == 1 too in lv_draw_sw_transform [`bd11ad8`](https://github.com/lvgl/lvgl/commit/bd11ad8542eac9ff51420e5afb80f7e6fcf36a5c) +- fix(example): fix warnings [`1e3ca25`](https://github.com/lvgl/lvgl/commit/1e3ca25fed13bbf85c32a60d4b7041cf8bd525ab) +- fix(benchmark): fix warnings [`1ed026c`](https://github.com/lvgl/lvgl/commit/1ed026ca7307957568fe419f1ff39a15b2535b3e) +- fix(draw): fix text color with sub pixel rendering and BGR order [`e050f5c`](https://github.com/lvgl/lvgl/commit/e050f5ca156f79d752894f38f0a437c946205cb4) +- fix(meter): fix setting part_draw_dsc.id in needle img drawing [`716e5e2`](https://github.com/lvgl/lvgl/commit/716e5e2c8bd2a22e7d56e8d7ca33054a11a1f4ed) +- fix(gridnav): fix stucking in pressed state with encoder [`ad56dfa`](https://github.com/lvgl/lvgl/commit/ad56dfaf7046a9bb8c05e877a8c8852cd14a59af) +- fix(darw): add back the disappeared antialising=0 support [`2c17b28`](https://github.com/lvgl/lvgl/commit/2c17b28ac476c95a4153ab6cabb77b1c7208bb74) +- fix(msg): fix typos in API by adding wrappers [`41fa416`](https://github.com/lvgl/lvgl/commit/41fa41613455260ccdeb87ecb890ce026ff0a435) +- fix(draw): fix transformation accuracy [`e06f03d`](https://github.com/lvgl/lvgl/commit/e06f03db72f98439078118518158f52439dd7bf8) +- fix(style): remove the reduntant define of LV_GRADIENT_MAX_STOPS [`903e94b`](https://github.com/lvgl/lvgl/commit/903e94b716ca1b32cdb51de11df679953699e53b) +- demo(benchmark): fix lv_label_set_text_fmt format strings [`ae38258`](https://github.com/lvgl/lvgl/commit/ae3825871e31cd42cad2f310bdfc605150670511) +- demo(benchmark): fix warning [`1173dcb`](https://github.com/lvgl/lvgl/commit/1173dcba96621e20c9a7240c8572bd6573bce6a0) + +## [v8.3.3](https://github.com/lvgl/lvgl/compare/v8.3.2...v8.3.3) 06 October 2022 + +v8.3.3 is the same as v8.3.2. It was released only because the version number was set incorrectly in lvgl.h. + +## [v8.3.2](https://github.com/lvgl/lvgl/compare/v8.3.1...v8.3.2) 27 September 2022 + +### Fixes + +- fix(fragment): fixed child fragment event dispatch [`3683`](https://github.com/lvgl/lvgl/pull/3683) +- fix(sdl): clear streaming/target texture with FillRect [`3682`](https://github.com/lvgl/lvgl/pull/3682) +- fix(sdl): transformation with alpha (#3576) [`3678`](https://github.com/lvgl/lvgl/pull/3678) +- fix(draw_sw): fix image cache to access the freed stack space [`3584`](https://github.com/lvgl/lvgl/pull/3584) +- fix(style): use compile time prop_cnt for const styles [`3609`](https://github.com/lvgl/lvgl/pull/3609) +- fix(demo): can not found lvgl.h file [`3477`](https://github.com/lvgl/lvgl/pull/3477) +- fix(ci) checkout lv_micropython release/v8 branch [`3524`](https://github.com/lvgl/lvgl/pull/3524) +- fix(canvas): fix clipéping on transformation [`b884aba`](https://github.com/lvgl/lvgl/commit/b884abae26f3824b27783a85d18ed51e550347c1) +- fix(draw): allow drawing outline with LV_DRAW_COMPLEX == 0 too [`ece3495`](https://github.com/lvgl/lvgl/commit/ece34950040e218fc73605a4e88f1060c2a274f8) +- fix(colorwheel): fix updating color when using lv_colorwheel_set_hsv [`d59bba1`](https://github.com/lvgl/lvgl/commit/d59bba12db115afb4b6aa53eed2625221dfff2fd) +- fix(slider): find the nearest value on click instead of floor [`dfd14fa`](https://github.com/lvgl/lvgl/commit/dfd14fa778aef25d0db61748a58aa9989ce5e2c8) +- fix(draw): fix border drawing with thick borders [`d5b2a9b`](https://github.com/lvgl/lvgl/commit/d5b2a9b2562cbfa327bf0ec03c11d28576037a14) +- fix(refr): fix true double double buffering logic with transparent screens [`8b605cc`](https://github.com/lvgl/lvgl/commit/8b605cc48224d0497cdd936fa77229e0c3d606d2) +- fix(group): be sure obj is removed from its current group in lv_group_add_obj [`5156ee0`](https://github.com/lvgl/lvgl/commit/5156ee058d5de674a00ffd84d15d460de7f0e53b) +- fix(style): add missing invalidation in lv_obj_remove_local_style_prop [`a0515ba`](https://github.com/lvgl/lvgl/commit/a0515ba30dd74b8b22a6709d334eb03782ee1a4d) + +### Docs + +- docs(draw) remove reference to old lv_fs_add_drv function [`3564`](https://github.com/lvgl/lvgl/pull/3564) +- docs(disp): LV_COLOR_SCREEN_TRANSP remove dependency on LV_COLOR_DEPTH_32 as transparency is supported across all color depths [`3556`](https://github.com/lvgl/lvgl/pull/3556) + +### CI and tests + +- ci: protect test.c with #if LV_BUILD_TEST [`be485d7`](https://github.com/lvgl/lvgl/commit/be485d7605136d2a5d6a633c7cb5b7c525cae7ee) + +### Others + +- chore(rt-thread) backport fixes from v9 [`3604`](https://github.com/lvgl/lvgl/pull/3604) + +- chore: fix warnings [`7640950`](https://github.com/lvgl/lvgl/commit/76409502163ffe67cfbab9c7f24f2226cc8a5941) +- remove accidentally added code [`5022476`](https://github.com/lvgl/lvgl/commit/5022476edc8676f2a6ef7b919d3578159edeef7c) + + ## [v8.3.1](https://github.com/lvgl/lvgl/compare/v8.3.0...v8.3.1) 25 July 2022 ### Fixes diff --git a/lib/lvgl/docs/get-started/platforms/arduino.md b/lib/lvgl/docs/get-started/platforms/arduino.md index e9ca2e4..2571cac 100644 --- a/lib/lvgl/docs/get-started/platforms/arduino.md +++ b/lib/lvgl/docs/get-started/platforms/arduino.md @@ -52,9 +52,14 @@ In the INO file you can see how to register a display and a touchpad for LVGL an Note that, there is no dedicated INO file for every example. Instead, you can load an example by calling an `lv_example_...` function. For example `lv_example_btn_1()`. -**IMPORTANT** +**IMPORTANT NOTE 1** Due to some the limitations of Arduino's build system you need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`. + +**IMPORTANT NOTE 2** +Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8) +as the examples and demos are now part of the main LVGL library. + ## Debugging and logging LVGL can display debug information in case of trouble. diff --git a/lib/lvgl/docs/get-started/platforms/index.md b/lib/lvgl/docs/get-started/platforms/index.md index 7ed6a01..7fba951 100644 --- a/lib/lvgl/docs/get-started/platforms/index.md +++ b/lib/lvgl/docs/get-started/platforms/index.md @@ -9,6 +9,7 @@ nxp stm32 espressif + renesas arduino tasmota-berry cmake diff --git a/lib/lvgl/docs/get-started/platforms/nxp.md b/lib/lvgl/docs/get-started/platforms/nxp.md index 9767fbf..48e25d2 100644 --- a/lib/lvgl/docs/get-started/platforms/nxp.md +++ b/lib/lvgl/docs/get-started/platforms/nxp.md @@ -1,6 +1,6 @@ # NXP -NXP has integrated LVGL into the MCUXpresso SDK packages for several of their general purpose and crossover -microcontrollers, allowing easy evaluation and migration into your product design. +NXP has integrated LVGL into the MCUXpresso SDK packages for general purpose and crossover microcontrollers, allowing +easy evaluation and migration into your product design. [Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) today and get started with your next GUI application. @@ -10,42 +10,40 @@ with PXP/VGLite support if the modules are present), no additional integration w ## HW acceleration for NXP iMX RT platforms Depending on the RT platform used, the acceleration can be done by NXP PXP (PiXel Pipeline) and/or the Verisilicon GPU -through an API named VGLite. There is a single NXP draw context that covers both GPUs allowing to have enabled either -one or even both at the same time. While enableing both 2D accelerators, the VGLite can be used to accelerate widget -drawing while the PXP accelerated blit and fill operations. +through an API named VGLite. Each accelerator has its own context that allows them to be used individually as well +simultaneously (in LVGL multithreading mode). -Supported draw callbacks are available in "src/draw/nxp/lv_gpu_nxp.c": +### PXP accelerator +Several drawing features in LVGL can be offloaded to the PXP engine. The CPU is available for other operations while the +PXP is running. RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for +power savings. + +Supported draw callbacks are available in "src/draw/nxp/pxp/lv_draw_pxp.c": ```c - nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc; - nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect; - nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded; - nxp_draw_ctx->blend = lv_draw_nxp_blend; + pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded; + pxp_draw_ctx->blend = lv_draw_pxp_blend; + pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish; + pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy; ``` -If enabled both GPUs, the PXP is the preffered one to be used for drawing operation. A fallback mechanism is -implemented so that if the feature is not supported by PXP (or if PXP fails), the VGLite will take over to handle the -task. At the end, the CPU will assure that every widget drawing is fully covered (if not already done by GPU). - -### PXP accelerator -Several drawing features in LVGL can be offloaded to the PXP engine. The VGLite (if supported) and CPU are available for -other operations while the PXP is running. An RTOS is required to block the LVGL drawing thread and switch to another -task or suspend the CPU for power savings. - #### Features supported: + All operations can be used in conjunction with optional transparency. + - RGB565 and ARGB8888 color formats - - Area fill + optional transparency - - BLIT (BLock Image Transfer) + optional transparency - - Color keying + optional transparency - - Recoloring (color tint) + optional transparency - - Image Rotation (90, 180, 270 degree) + optional transparency - - Recoloring (color tint) + Image Rotation (90, 180, 270 degree) + optional transparency + - Area fill with color + - BLIT (BLock Image Transfer) - Screen Rotation (90, 180, 270 degree) + - Color keying + - Recoloring (color tint) + - Image Rotation (90, 180, 270 degree) + - Buffer copy - RTOS integration layer - Default FreeRTOS and bare metal code provided - - Combination of recolor and/or rotation + color key/alpha blend/transparency is supported but PXP needs two steps. - First step is to recolor/rotate the image to a temporarly buffer (please check LV_MEM_SIZE value for allocation limit) - and another step is required to handle color keying, alpha chanel or to apply transparency. + - Combination of recolor and/or rotation + color key/alpha blend/transparency is supported. + That is achieved by PXP in two steps: + - First step is to recolor/rotate the image to a temporary buffer (statically allocated) + - Second step is required to handle color keying, alpha channel or to apply transparency #### Known limitations: - Rotation is not supported for images unaligned to blocks of 16x16 pixels. @@ -78,51 +76,71 @@ and the final output image can look shifted. #### Project setup: - Add PXP related files to project: - - src/draw/nxp/pxp/lv_gpu_nxp_pxp.c, src/draw/nxp/pxp/lv_gpu_nxp_pxp.h: init, uninit, run/wait PXP device, log/trace - - src/draw/nxp/pxp/lv_draw_pxp_blend.c, src/draw/nxp/pxp/lv_draw_pxp_blend.h: fill and blit (w/o transformation) - - src/draw/nxp/pxp/lv_gpu_nxp_osa.c, src/draw/nxp/pxp/lv_gpu_osa.h: default implementation of OS-specific functions - (bare metal and FreeRTOS only) + - src/draw/nxp/pxp/lv_draw_pxp.c[.h]: draw context callbacks + - src/draw/nxp/pxp/lv_draw_pxp_blend.c[.h]: fill and blit (with optional transformation) + - src/draw/nxp/pxp/lv_gpu_nxp_pxp.c[.h]: init, uninit, run/wait PXP device + - src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c[.h]: OS abstraction (FreeRTOS or bare metal) - optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1 - PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project: - - fsl_pxp.c, fsl_pxp.h: PXP driver - - fsl_cache.c, fsl_cache.h: CPU cache handling functions + - fsl_pxp.c[.h]: PXP driver + - fsl_cache.c[.h]: CPU cache handling functions #### Logging: - - By default, LV_GPU_NXP_PXP_LOG_ERRORS is enabled so that any PXP error will be seen on LVGL output - - For tracing logs about the PXP limitations or size thresholds, the user can enable LV_GPU_NXP_PXP_LOG_TRACES + - By default, `LV_GPU_NXP_PXP_LOG_ERRORS` is enabled so that any PXP error will be seen on SDK debug console + - By default, `LV_GPU_NXP_PXP_LOG_TRACES` is disabled. Enable it for tracing logs (like PXP limitations) #### Advanced configuration: - Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is - used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and baremetal is - provided in lv_gpu_nxp_osa.c + used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and bare metal is + provided in lv_gpu_nxp_pxp_osa.c - `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup) - `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup) - `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before leaving this function. - - There are configurable area thresholds which are used to decide whether the area will be processed by CPU or by PXP. - Areas smaller than a defined value will be processed by CPU and those bigger than the threshold will be processed by - PXP. These thresholds may be defined as preprocessor variables. Default values are defined in lv_draw_pxp_blend.h - - `LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, BLIT with recolor and - BLIT with rotation (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, BLIT with recolor - and BLIT with rotation and transparency (OPA < LV_OPA_MAX) - - `LV_GPU_NXP_PXP_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX) + - Area threshold (size limit) is configurable and used to decide whether the area will be processed by PXP or not. + Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by + PXP. The threshold is defined as a macro in lv_draw_pxp.c + - `LV_GPU_NXP_PXP_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation) ### VGLite accelerator -Extra drawing features in LVGL can be handled by the VGLite engine. The PXP (if supported) and CPU are available for -other operations while the VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another -task or suspend the CPU for power savings. +Extra drawing features in LVGL can be handled by the VGLite engine. The CPU is available for other operations while the +VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU +for power savings. + +Supported draw callbacks are available in "src/draw/nxp/vglite/lv_draw_vglite.c": +```c + vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf; + vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line; + vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc; + vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect; + vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded; + vglite_draw_ctx->blend = lv_draw_vglite_blend; + vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish; + vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy; +``` #### Features supported: + All operations can be used in conjunction with optional transparency. + - RGB565 and ARGB8888 color formats - - Area fill + optional transparency - - BLIT (BLock Image Transfer) + optional transparency - - Image Rotation (any degree with decimal) + optional transparency - - Image Scale + optional transparency - - Draw background rectangle with radius or gradient - - Draw arc - - RTOS integration layer + - Area fill with color + - BLIT (BLock Image Transfer) + - Image Rotation (any degree with decimal) + - Image Scale + - Draw rectangle background with optional radius or gradient + - Blit rectangle background image + - Draw rectangle border/outline with optional rounded corners + - Draw arc with optional rounded ending + - Draw line or dashed line with optional rounded ending + - Buffer copy + +#### Known limitations: + - Source image alignment: + The byte alignment requirement for a pixel depends on the specific pixel format. Both buffer address and buffer stride + must be aligned. As general rule, the alignment is set to 16 pixels. This makes the buffer address alignment to be + 32 bytes for RGB565 and 64 bytes for ARGB8888. + - For pixel engine (PE) destination, the alignment should be 64 bytes for all tiled (4x4) buffer layouts. + The pixel engine has no additional alignment requirement for linear buffer layouts (`VG_LITE_LINEAR`). #### Basic configuration: - Select NXP VGLite engine in lv_conf.h: Set `LV_USE_GPU_NXP_VG_LITE` to 1 @@ -130,8 +148,8 @@ task or suspend the CPU for power savings. #### Basic initialization: - Initialize VGLite before calling `lv_init()` by specifying the width/height of tessellation window. Value should be - a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than frame width. If less than or equal to 0, - then no tessellation buffer is created, in which case the function is used for a blit init. + a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than the frame width. If less than or equal + to 0, then no tessellation buffer is created, in which case VGLite is initialized only for blitting. ```c #if LV_USE_GPU_NXP_VG_LITE #include "vg_lite.h" @@ -144,25 +162,21 @@ task or suspend the CPU for power savings. #### Project setup: - Add VGLite related files to project: - - src/draw/nxp/vglite/lv_gpu_nxp_vglite.c, src/draw/nxp/vglite/lv_gpu_nxp_vglite.h: buffer init, log/trace - - src/draw/nxp/vglite/lv_draw_vglite_blend.c, src/draw/nxp/vglite/lv_draw_vglite_blend.h: fill and blit - (w/o transformation) - - src/draw/nxp/vglite/lv_draw_vglite_rect.c, src/draw/nxp/vglite/lv_draw_vglite_rect.h: rectangle draw - - src/draw/nxp/vglite/lv_draw_vglite_arc.c, src/draw/nxp/vglite/lv_draw_vglite_arc.h: arc draw + - src/draw/nxp/vglite/lv_draw_vglite.c[.h]: draw context callbacks + - src/draw/nxp/vglite/lv_draw_vglite_blend.c[.h]: fill and blit (with optional transformation) + - src/draw/nxp/vglite/lv_draw_vglite_rect.c[.h]: draw rectangle + - src/draw/nxp/vglite/lv_draw_vglite_arc.c[.h]: draw arc + - src/draw/nxp/vglite/lv_draw_vglite_line.c[.h]: draw line + - src/draw/nxp/vglite/lv_vglite_buf.c[.h]: init/get vglite buffer + - src/draw/nxp/vglite/lv_vglite_utils.c[.h]: function helpers #### Logging: - - By default, LV_GPU_NXP_VG_LITE_LOG_ERRORS is enabled so that any VGLite error will be seen on LVGL output - - For tracing logs about the VGLite limitations, size thresholds or stride alignment, the user can enable - LV_GPU_NXP_VG_LITE_LOG_TRACES + - By default, `LV_GPU_NXP_VG_LITE_LOG_ERRORS` is enabled so that any VGLite error will be seen on SDK debug console + - By default, `LV_GPU_NXP_VG_LITE_LOG_TRACES` is disabled. Enable it for tracing logs (like blit split workaround or + VGLite fallback to CPU due to any error on the driver) #### Advanced configuration: - - There are configurable area thresholds which are used to decide whether the area will be processed by CPU or by - VGLite. Areas smaller than a defined value will be processed by CPU and those bigger than the threshold will be - processed by VGLite. These thresholds may be defined as preprocessor variables. Default values are defined in - lv_draw_vglite_blend.h - - `LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with scale and BLIT with rotation - (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT, BLIT with scale and BLIT with rotation - and transparency (OPA < LV_OPA_MAX) - - `LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX) + - Area threshold (size limit) is configurable and used to decide whether the area will be processed by VGLite or not. + Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by + VGLite. The threshold is defined as a macro in lv_draw_vglite.c + - `LV_GPU_NXP_VG_LITE_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation) diff --git a/lib/lvgl/docs/get-started/platforms/pc-simulator.md b/lib/lvgl/docs/get-started/platforms/pc-simulator.md index 3bdc495..95c35ff 100644 --- a/lib/lvgl/docs/get-started/platforms/pc-simulator.md +++ b/lib/lvgl/docs/get-started/platforms/pc-simulator.md @@ -15,7 +15,7 @@ The simulator is ported to various IDEs (Integrated Development Environments). C - [Eclipse with SDL driver](https://github.com/lvgl/lv_sim_eclipse_sdl): Recommended on Linux and Mac - [CodeBlocks](https://github.com/lvgl/lv_sim_codeblocks_win): Recommended on Windows -- [VisualStudio with SDL driver](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows +- [VisualStudio](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows - [VSCode with SDL driver](https://github.com/lvgl/lv_sim_vscode_sdl): Recommended on Linux and Mac - [PlatformIO with SDL driver](https://github.com/lvgl/lv_platformio): Recommended on Linux and Mac - [MDK with FastModel](https://github.com/lvgl/lv_port_an547_cm55_sim): For Windows diff --git a/lib/lvgl/docs/get-started/platforms/renesas.md b/lib/lvgl/docs/get-started/platforms/renesas.md new file mode 100644 index 0000000..b33095f --- /dev/null +++ b/lib/lvgl/docs/get-started/platforms/renesas.md @@ -0,0 +1,129 @@ +# Renesas +The [HMI-Board](https://bit.ly/3I9nfUo) development board SDK now comes with LVGL integration for quick evaluation. Simply download the [SDK](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/tree/main/projects/hmi-board-lvgl) for the supported motherboard and you’ll be on your way to creating your next GUI application in no time. For more information, check out the [Software design description](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/blob/main/projects/hmi-board-lvgl/README.md). + +## Creating new project with LVGL +It is recommended to start your project by downloading the HMI-Board SDK example project. It comes fully equipped with LVGL and dave-2d support (if the modules are present), so you won’t need to do any additional integration work. + +## HW acceleration for Renesas RA6M3 platforms +For RA6M3 platforms, hardware acceleration can be achieved using the dave-2d GPU, depending on the platform used. Each accelerator has its own context, allowing them to be used individually or simultaneously in LVGL’s multithreading mode. + +### Dave-2d accelerator +LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”. + +LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”. + +```c + ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend; + ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded; + ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait; + ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter; +``` + +### Features supported: + All operations can be used in conjunction with optional transparency. + + - RGB565 and ARGB8888 color formats + - Area fill with color + - BLIT (BLock Image Transfer) + - Color conversion + - Rotate and scale + - Alpha blending + - Bilinear filtering + - RTOS integration layer + - Default RT-Thread code provided + - Subpixel exact placement + +### Basic configuration: + - Select Renesas dave-2d engine in lv_conf.h: Set `LV_USE_GPU_RA6M3_G2D` to 1 + - Set referenced header file in lv_conf.h: `#define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"` + +### RT-Thread Example: + +```c +#define COLOR_BUFFER (LV_HOR_RES_MAX * LV_VER_RES_MAX) + +static lv_disp_drv_t disp_drv; + +/*A static or global variable to store the buffers*/ +static lv_color_t buf_1[COLOR_BUFFER]; +``` + +- After initializing your peripherals (such as SPI, GPIOs, and LCD) in the `lv_port_disp_init()` function, you can initialize LVGL using [`lv_init()`.](https://docs.lvgl.io/master/API/core/lv_obj.html#_CPPv47lv_initv) Next, register the frame buffers using `lv_disp_draw_buf_init()` and create a new display driver using `lv_disp_drv_init()`. + +```c +/*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */ +lv_disp_draw_buf_init(&disp_buf, buf_1, RT_NULL, COLOR_BUFFER); +lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + +/*Set the resolution of the display*/ +disp_drv.hor_res = LV_HOR_RES_MAX; +disp_drv.ver_res = LV_VER_RES_MAX; + +/*Set a display buffer*/ +disp_drv.draw_buf = &disp_buf; + +/*Used to copy the buffer's content to the display*/ +disp_drv.flush_cb = disp_flush; + +/* Initialize GPU module */ +lv_port_gpu_hw_init(); + +/*Finally register the driver*/ +lv_disp_drv_register(&disp_drv); +``` + +* To run LVGL, you’ll need to create a thread. You can find examples of how to do this using RT-Thread in the `env_support/rt-thread/lv_rt_thread_port.c` file. + +```c +static void lvgl_thread_entry(void *parameter) +{ +#if LV_USE_LOG + lv_log_register_print_cb(lv_rt_log); +#endif /* LV_USE_LOG */ + lv_init(); + lv_port_disp_init(); + lv_port_indev_init(); + lv_user_gui_init(); + + /* handle the tasks of LVGL */ + while(1) + { + lv_task_handler(); + rt_thread_mdelay(LV_DISP_DEF_REFR_PERIOD); + } +} + +static int lvgl_thread_init(void) +{ + rt_err_t err; + + /* create lvgl thread */ + err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL, + &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10); + if(err != RT_EOK) + { + LOG_E("Failed to create LVGL thread"); + return -1; + } + rt_thread_startup(&lvgl_thread); + + return 0; +} +INIT_ENV_EXPORT(lvgl_thread_init); +``` + +- The last step is to create a function to output the frame buffer to your LCD. The specifics of this function will depend on the features of your MCU. Here’s an example for a typical MCU interface: `my_flush_cb`. + +```c +static void my_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ +#ifdef PKG_USING_ILI9341 + lcd_fill_array_spi(area->x1, area->y1, area->x2, area->y2, color_p); +#elif LV_USE_GPU_RA6M3_G2D + lv_port_gpu_blit(area->x1, area->y1, color_p, area); +#else + ...... +#endif + lv_disp_flush_ready(disp_drv); +} +``` diff --git a/lib/lvgl/docs/intro/index.md b/lib/lvgl/docs/intro/index.md index 0d20b28..62508d1 100644 --- a/lib/lvgl/docs/intro/index.md +++ b/lib/lvgl/docs/intro/index.md @@ -132,7 +132,7 @@ LVGL needs just one simple driver function to copy an array of pixels into a giv If you can do this with your display then you can use it with LVGL. Some examples of the supported display types: -- TFTs with 16 or 24 bit color depth +- TFTs with 16 or 32 bit color depth - Monitors with an HDMI port - Small monochrome displays - Gray-scale displays diff --git a/lib/lvgl/docs/libs/fsdrv.md b/lib/lvgl/docs/libs/fsdrv.md index 7b9015a..8f828d9 100644 --- a/lib/lvgl/docs/libs/fsdrv.md +++ b/lib/lvgl/docs/libs/fsdrv.md @@ -2,14 +2,38 @@ # File System Interfaces LVGL has a [File system](https://docs.lvgl.io/master/overview/file-system.html) module to provide an abstraction layer for various file system drivers. +You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, LittleFS, STDIO, POSIX, WIN32 and LVGL. -LVG has built in support for: -- [FATFS](http://elm-chan.org/fsw/ff/00index_e.html) -- STDIO (Linux and Windows using C standard function .e.g fopen, fread) -- POSIX (Linux and Windows using POSIX function .e.g open, read) -- WIN32 (Windows using Win32 API function .e.g CreateFileA, ReadFile) +## Built in wrappers -You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, STDIO, POSIX, WIN32 and LVGL. +### FATFS + +Bridge for [FatFS](http://elm-chan.org/fsw/ff/00index_e.html). FatFS itself is not part of LVGL, but can be added and initialized externally. + + +### LittleFS + +Though `lv_fs_littlefs` uses [LittleFS]((https://github.com/littlefs-project/littlefs)) API, the LittleFS library needs other external libraries that handle the mounting of partitions and low-level accesses, according to the given architecture. The functions for the latter are given to the lfs_t structure as pointers by an external low-level library. + +There's a convenience function called `lv_fs_littlefs_set_driver(LV_FS_LITTLEFS_LETTER, my_lfs)`, specific to `lv_fs_littlefs`, to attach a `lfs_t` object's pointer to a registered driver-letter. See its comments for more info. + + +[esp_littlefs](https://components.espressif.com/components/joltwallet/littlefs) is a wrapper for LittleFS to be used in Espressif ESP-devices. It handles the mounting and has the low-level `littlefs_api` functions to read/write/erase blocks that LittleFS library needs. On mounting by `esp_littlefs` the `lfs_t` structures are created. You need to get a handle to these to use ESP with `lv_fs_littlefs`, as all functions use that `lfs_t` in LittleFS to identify the mounted partition. + + +In case you don't find a special function in the `lv_fs_littlefs` wrapper, you can look for it in the `esp_littlefs` API and use it directly, as `lv_fs_littlefs` and the `esp_littlefs` APIs can be used side-by-side. + +### STDIO + +Bride to C standard functions on Linux and Windows. For example `fopen`, `fread`, etc. + +### POSIX + +Bride to POSIX functions on Linux and Windows. For example `open`, `read`, etc. + +### WIN32 + +Bride to Win32 API function. For example `CreateFileA`, `ReadFile`, etc. ## Usage diff --git a/lib/lvgl/docs/libs/index.md b/lib/lvgl/docs/libs/index.md index 8217e91..f0eb900 100644 --- a/lib/lvgl/docs/libs/index.md +++ b/lib/lvgl/docs/libs/index.md @@ -12,6 +12,7 @@ png gif freetype + tiny_ttf qrcode rlottie ffmpeg diff --git a/lib/lvgl/docs/libs/tiny_ttf.md b/lib/lvgl/docs/libs/tiny_ttf.md new file mode 100644 index 0000000..fd795ae --- /dev/null +++ b/lib/lvgl/docs/libs/tiny_ttf.md @@ -0,0 +1,35 @@ +# Tiny TTF font engine + +## Usage + +Use https://github.com/nothings/stb to render TrueType fonts in LVGL. + +When enabled in `lv_conf.h` with `LV_USE_TINY_TTF` +`lv_tiny_ttf_create_data(data, data_size, font_size)` can be used to +create a TTF font instance at the specified font size. You can then +use that font anywhere `lv_font_t` is accepted. + +By default, the TTF or OTF file must be embedded as an array, either in +a header, or loaded into RAM in order to function. + +However, if `LV_TINY_TTF_FILE_SUPPORT` is enabled, +`lv_tiny_ttf_create_file(path, font_size)` will also be available, +allowing tiny_ttf to stream from a file. The file must remain open the +entire time the font is being used, and streaming on demand may be +considerably slower. + +After a font is created, you can change the font size in pixels by using +`lv_tiny_ttf_set_size(font, font_size)`. + +By default, a font will use up to 4KB of cache to speed up rendering +glyphs. This maximum can be changed by using +`lv_tiny_ttf_create_data_ex(data, data_size, font_size, cache_size)` +or `lv_tiny_ttf_create_file_ex(path, font_size, cache_size)` (when +available). The cache size is indicated in bytes. + +## API + +```eval_rst +.. doxygenfile:: lv_tiny_ttf.h + :project: lvgl +``` diff --git a/lib/lvgl/docs/overview/display.md b/lib/lvgl/docs/overview/display.md index 66f8462..4626a56 100644 --- a/lib/lvgl/docs/overview/display.md +++ b/lib/lvgl/docs/overview/display.md @@ -63,12 +63,11 @@ See the [Display background](#display-background) section for more details. If t This configuration (transparent screen and display) could be used to create for example OSD menus where a video is played on a lower layer, and a menu is overlayed on an upper layer. To handle transparent displays, special (slower) color mixing algorithms need to be used by LVGL so this feature needs to enabled with `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h`. -As this mode operates on the Alpha channel of the pixels `LV_COLOR_DEPTH = 32` is also required. The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 where there are solid objects. +The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 where there are solid objects. In summary, to enable transparent screens and displays for OSD menu-like UIs: - Enable `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h` -- Be sure to use `LV_COLOR_DEPTH 32` -- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_local_bg_opa(lv_scr_act(), LV_OBJMASK_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP)` +- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_TRANSP, LV_PART_MAIN)` - Set the display opacity to `LV_OPA_TRANSP` with `lv_disp_set_bg_opa(NULL, LV_OPA_TRANSP);` ## Features of displays diff --git a/lib/lvgl/docs/overview/layer.md b/lib/lvgl/docs/overview/layer.md index 8cb4645..dd4301b 100644 --- a/lib/lvgl/docs/overview/layer.md +++ b/lib/lvgl/docs/overview/layer.md @@ -34,11 +34,11 @@ lv_label_set_text(label2, "Button 2"); /*Set the text of the label*/ lv_obj_del(label2); ``` -## Bring to the foreground +## Change order There are four explicit ways to bring an object to the foreground: - Use `lv_obj_move_foreground(obj)` to bring an object to the foreground. Similarly, use `lv_obj_move_background(obj)` to move it to the background. -- Use `lv_obj_move_up(obj)` to move an object one position up in the hierarchy, Similarly, use `lv_obj_move_down(obj)` to move an object one position down in the hierarchy. +- Use `lv_obj_move_to_index(obj, idx)` to move an object to a given index in the order of children. (0: backgroud, child_num - 1: foreground, <0: count from the top, to move forward (up): `lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1)`) - Use `lv_obj_swap(obj1, obj2)` to swap the relative layer position of two objects. - When `lv_obj_set_parent(obj, new_parent)` is used, `obj` will be on the foreground of the `new_parent`. diff --git a/lib/lvgl/docs/overview/object.md b/lib/lvgl/docs/overview/object.md index a2849dc..d019c35 100644 --- a/lib/lvgl/docs/overview/object.md +++ b/lib/lvgl/docs/overview/object.md @@ -173,7 +173,7 @@ All inputs are disabled during the screen animation. Screens are created on the currently selected *default display*. The *default display* is the last registered display with `lv_disp_drv_register`. You can also explicitly select a new default display using `lv_disp_set_default(disp)`. -`lv_scr_act()`, `lv_scr_load()` and `lv_scr_load_anim()` operate on the default screen. +`lv_scr_act()`, `lv_scr_load()` and `lv_scr_load_anim()` operate on the default display. Visit [Multi-display support](/overview/display) to learn more. diff --git a/lib/lvgl/docs/overview/renderers/arm-2d.md b/lib/lvgl/docs/overview/renderers/arm-2d.md index d655477..85a4dbc 100644 --- a/lib/lvgl/docs/overview/renderers/arm-2d.md +++ b/lib/lvgl/docs/overview/renderers/arm-2d.md @@ -1,4 +1,32 @@ -# ARM-2D GPU +# Arm-2D GPU -TODO +Arm-2D is not a GPU but **an abstraction layer for 2D GPUs dedicated to Microcontrollers**. It supports all Cortex-M processors ranging from Cortex-M0 to the latest Cortex-M85. +Arm-2D is an open-source project on Github. For more, please refer to: https://github.com/ARM-software/Arm-2D. + + + +## How to Use + +In general, you can set the macro `LV_USE_GPU_ARM2D` to `1`in `lv_conf.h` to enable Arm-2D acceleration for LVGL. + +If you are using **[CMSIS-Pack](https://github.com/lvgl/lvgl/tree/master/env_support/cmsis-pack)** to deploy the LVGL. You don't have to define the macro `LV_USE_GPU_ARM2D` manually, instead, please select the component `GPU Arm-2D` in the **RTE** dialog. This step will define the macro for us. + + + +## Design Considerations + +As mentioned before, Arm-2D is an abstraction layer for 2D GPU; hence if there is no accelerator or dedicated instruction set (such as Helium or ACI) available for Arm-2D, it provides negligible performance boost for LVGL (sometimes worse) for regular Cortex-M processors. + +**We highly recommend you enable Arm-2D acceleration for LVGL** when: + +- The target processors are **Cortex-M55** and/or **Cortex-M85** +- The target processors support **[Helium](https://developer.arm.com/documentation/102102/0103/?lang=en)**. +- The device vendor provides an arm-2d compliant driver for their propriotory 2D accelerators and/or customized instruction set. +- The target device contains [DMA-350](https://community.arm.com/arm-community-blogs/b/internet-of-things-blog/posts/arm-corelink-dma-350-next-generation-direct-memory-access-for-endpoint-ai) + + + +## Examples + +- [A Cortex-M55 (supports Helium) based MDK Project, PC emulation is available.](https://github.com/lvgl/lv_port_an547_cm55_sim) diff --git a/lib/lvgl/docs/overview/style-props.md b/lib/lvgl/docs/overview/style-props.md index 74a0cd5..ab08df9 100644 --- a/lib/lvgl/docs/overview/style-props.md +++ b/lib/lvgl/docs/overview/style-props.md @@ -355,7 +355,7 @@ Set the opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means full ### border_width -Set hte width of the border. Only pixel values can be used. +Set the width of the border. Only pixel values can be used.
  • Default 0
  • Inherited No
  • @@ -708,6 +708,15 @@ Scale down all opacity values of the object by this factor. Value 0, `LV_OPA_0`
  • Ext. draw No
+### opa_layered +First draw the object on the layer, then scale down layer opacity factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. +
    +
  • Default `LV_OPA_COVER`
  • +
  • Inherited Yes
  • +
  • Layout No
  • +
  • Ext. draw No
  • +
+ ### color_filter_dsc Mix a color to all colors of the object.
    @@ -772,7 +781,7 @@ Describes how to blend the colors to the background. The possible values are `LV
### layout -Set the layout if the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts. +Set the layout of the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts.
  • Default 0
  • Inherited No
  • diff --git a/lib/lvgl/docs/porting/display.md b/lib/lvgl/docs/porting/display.md index f06d48d..015b902 100644 --- a/lib/lvgl/docs/porting/display.md +++ b/lib/lvgl/docs/porting/display.md @@ -204,6 +204,10 @@ The default rotation of your display when it is initialized can be set using the Display rotation can also be changed at runtime using the `lv_disp_set_rotation(disp, rot)` API. +If you enable rotation the coordinates of the pointer input devices (e.g. touchpad) will be rotated too. + +Note that when using software rotation, you cannot use neither `direct_mode` nor `full_refresh` in the driver. When using either of these, you will have to rotate the pixels yourself e.g. in the `flush_cb`. + Support for software rotation is a new feature, so there may be some glitches/bugs depending on your configuration. If you encounter a problem please open an issue on [GitHub](https://github.com/lvgl/lvgl/issues). ### Decoupling the display refresh timer diff --git a/lib/lvgl/docs/porting/indev.md b/lib/lvgl/docs/porting/indev.md index 0066f56..50958a0 100644 --- a/lib/lvgl/docs/porting/indev.md +++ b/lib/lvgl/docs/porting/indev.md @@ -114,7 +114,7 @@ You need to have 3 buttons available: - `LV_KEY_RIGHT` will simulate turning encoder right - other keys will be passed to the focused widget -If you hold the keys it will simulate an encoder advance with period specified in `indev_drv.long_press_rep_time`. +If you hold the keys it will simulate an encoder advance with period specified in `indev_drv.long_press_repeat_time`. ```c indev_drv.type = LV_INDEV_TYPE_ENCODER; @@ -172,7 +172,7 @@ The default value of the following parameters can be changed in `lv_indev_drv_t` - `scroll_limit` Number of pixels to slide before actually scrolling the object. - `scroll_throw` Scroll throw (momentum) slow-down in [%]. Greater value means faster slow-down. - `long_press_time` Press time to send `LV_EVENT_LONG_PRESSED` (in milliseconds) -- `long_press_rep_time` Interval of sending `LV_EVENT_LONG_PRESSED_REPEAT` (in milliseconds) +- `long_press_repeat_time` Interval of sending `LV_EVENT_LONG_PRESSED_REPEAT` (in milliseconds) - `read_timer` pointer to the `lv_timer` which reads the input device. Its parameters can be changed by `lv_timer_...()` functions. `LV_INDEV_DEF_READ_PERIOD` in `lv_conf.h` sets the default read period. ### Feedback diff --git a/lib/lvgl/docs/widgets/core/btnmatrix.md b/lib/lvgl/docs/widgets/core/btnmatrix.md index a9ca82e..152ef58 100644 --- a/lib/lvgl/docs/widgets/core/btnmatrix.md +++ b/lib/lvgl/docs/widgets/core/btnmatrix.md @@ -25,7 +25,7 @@ So in the example the first row will have 2 buttons each with 50% width and a se The buttons' width can be set relative to the other button in the same row with `lv_btnmatrix_set_btn_width(btnm, btn_id, width)` E.g. in a line with two buttons: *btnA, width = 1* and *btnB, width = 2*, *btnA* will have 33 % width and *btnB* will have 66 % width. It's similar to how the [`flex-grow`](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow) property works in CSS. -The width must be in the \[1..7\] range and the default width is 1. +The width must be in the \[1..15\] range and the default width is 1. In addition to the width, each button can be customized with the following parameters: - `LV_BTNMATRIX_CTRL_HIDDEN` Makes a button hidden (hidden buttons still take up space in the layout, they are just not visible or clickable) diff --git a/lib/lvgl/docs/widgets/core/dropdown.md b/lib/lvgl/docs/widgets/core/dropdown.md index c14b933..7e1e185 100644 --- a/lib/lvgl/docs/widgets/core/dropdown.md +++ b/lib/lvgl/docs/widgets/core/dropdown.md @@ -43,7 +43,7 @@ Options are passed to the drop-down list as a string with `lv_dropdown_set_optio The `lv_dropdown_add_option(dropdown, "New option", pos)` function inserts a new option to `pos` index. -To save memory the options can set from a static(constant) string too with `lv_dropdown_set_static_options(dropdown, options)`. +To save memory the options can set from a static(constant) string too with `lv_dropdown_set_options_static(dropdown, options)`. In this case the options string should be alive while the drop-down list exists and `lv_dropdown_add_option` can't be used You can select an option manually with `lv_dropdown_set_selected(dropdown, id)`, where `id` is the index of an option. diff --git a/lib/lvgl/docs/widgets/core/label.md b/lib/lvgl/docs/widgets/core/label.md index cf2b3c8..841ef23 100644 --- a/lib/lvgl/docs/widgets/core/label.md +++ b/lib/lvgl/docs/widgets/core/label.md @@ -44,7 +44,9 @@ This is not the case with `lv_label_set_text_static`. The buffer you pass to `lv ### Text recolor In the text, you can use commands to recolor parts of the text. For example: `"Write a #ff0000 red# word"`. -This feature can be enabled individually for each label by `lv_label_set_recolor()` function. +This feature can be enabled individually for each label by `lv_label_set_recolor()` function, +recoloring is only supported when the text wrapped with `##ff0000 ... #`sintax is in one line, +it is not supported in wrapped text, see example `Line wrap, recoloring and scrolling`. ### Text selection If enabled by `LV_LABEL_TEXT_SELECTION` part of the text can be selected. It's similar to when you use your mouse on a PC to select a text. diff --git a/lib/lvgl/docs/widgets/extra/calendar.md b/lib/lvgl/docs/widgets/extra/calendar.md index 5dd601d..0fd3630 100644 --- a/lib/lvgl/docs/widgets/extra/calendar.md +++ b/lib/lvgl/docs/widgets/extra/calendar.md @@ -1,5 +1,7 @@ # Calendar (lv_calendar) +**From v8.1 the header is added directly into the Calendar widget and the API of the headers has been changed.** + ## Overview The Calendar object is a classic calendar which can: @@ -13,13 +15,16 @@ The Calendar is added to the default group (if it is set). Calendar is an editab To make the Calendar flexible, by default it doesn't show the current year or month. Instead, there are optional "headers" that can be attached to the calendar. ## Parts and Styles -The calendar object uses the [Button matrix](/widgets/core/btnmatrix) object under the hood to arrange the days into a matrix. -- `LV_PART_MAIN` The background of the calendar. Uses all the background related style properties. -- `LV_PART_ITEMS` Refers to the dates and day names. Button matrix control flags are set to differentiate the buttons and a custom drawer event is added modify the properties of the buttons as follows: - - day names have no border, no background and drawn with a gray color - - days of the previous and next month have `LV_BTNMATRIX_CTRL_DISABLED` flag - - today has a thicker border with the theme's primary color - - highlighted days have some opacity with the theme's primary color. +The Calendar is composed of 3 widegets +- Container: A rectangle which is a container for the *Header* and the *Days*. Uses only `LV_PART_MAIN` where all the background related style properties are working. +- Days: It's a [Button matrix](/widgets/core/btnmatrix) object under the hood to arrange the days into a matrix. `lv_calendar_get_btnmatrix(calendar)` can be used to get it. + - `LV_PART_MAIN` The background of the calendar. Uses all the background related style properties. + - `LV_PART_ITEMS` Refers to the dates and day names. Button matrix control flags are set to differentiate the buttons and a custom drawer event is added modify the properties of the buttons as follows: + - day names have no border, no background and drawn with a gray color + - days of the previous and next month have `LV_BTNMATRIX_CTRL_DISABLED` flag + - today has a thicker border with the theme's primary color + - highlighted days have some opacity with the theme's primary color. +- Header: Not created by default, the details are up to the given header. ## Usage @@ -53,8 +58,6 @@ Learn more about [Keys](/overview/indev). ## Headers -**From v8.1 the header is added directly into the Calendar widget and the API of the headers has been changed.** - ### Arrow buttons `lv_calendar_header_arrow_create(calendar)` creates a header that contains a left and right arrow on the sides and a text with the current year and month between them. diff --git a/lib/lvgl/env_support/cmake/custom.cmake b/lib/lvgl/env_support/cmake/custom.cmake index 5616982..7da6812 100644 --- a/lib/lvgl/env_support/cmake/custom.cmake +++ b/lib/lvgl/env_support/cmake/custom.cmake @@ -63,6 +63,12 @@ install( FILES_MATCHING PATTERN "*.h") +install( + FILES "${LV_CONF_PATH}" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/../" + RENAME "lv_conf.h" + OPTIONAL) + set_target_properties( lvgl PROPERTIES OUTPUT_NAME lvgl diff --git a/lib/lvgl/env_support/cmake/esp.cmake b/lib/lvgl/env_support/cmake/esp.cmake index a8671da..edc3709 100644 --- a/lib/lvgl/env_support/cmake/esp.cmake +++ b/lib/lvgl/env_support/cmake/esp.cmake @@ -12,22 +12,43 @@ if(LV_MICROPYTHON) ${LVGL_ROOT_DIR}/../ REQUIRES main) +else() + if(CONFIG_LV_BUILD_EXAMPLES) + file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c) + set_source_files_properties(${EXAMPLE_SOURCES} COMPILE_FLAGS "-Wno-unused-variable -Wno-format") + endif() - target_compile_definitions(${COMPONENT_LIB} - INTERFACE "-DLV_CONF_INCLUDE_SIMPLE") - - if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM) - target_compile_definitions(${COMPONENT_LIB} - INTERFACE "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR") + if(CONFIG_LV_USE_DEMO_WIDGETS) + file(GLOB_RECURSE DEMO_WIDGETS_SOURCES ${LVGL_ROOT_DIR}/demos/widgets/*.c) + list(APPEND DEMO_SOURCES ${DEMO_WIDGETS_SOURCES}) endif() -else() - idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${LVGL_ROOT_DIR} - ${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../) + if(CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER) + file(GLOB_RECURSE DEMO_KEYPAD_AND_ENCODER_SOURCES ${LVGL_ROOT_DIR}/demos/keypad_encoder/*.c) + list(APPEND DEMO_SOURCES ${DEMO_KEYPAD_AND_ENCODER_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_BENCHMARK) + file(GLOB_RECURSE DEMO_BENCHMARK_SOURCES ${LVGL_ROOT_DIR}/demos/benchmark/*.c) + list(APPEND DEMO_SOURCES ${DEMO_BENCHMARK_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_STRESS) + file(GLOB_RECURSE DEMO_STRESS_SOURCES ${LVGL_ROOT_DIR}/demos/stress/*.c) + list(APPEND DEMO_SOURCES ${DEMO_STRESS_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_MUSIC) + file(GLOB_RECURSE DEMO_MUSIC_SOURCES ${LVGL_ROOT_DIR}/demos/music/*.c) + list(APPEND DEMO_SOURCES ${DEMO_MUSIC_SOURCES}) + set_source_files_properties(${DEMO_MUSIC_SOURCES} COMPILE_FLAGS "-Wno-format") + endif() + + idf_component_register(SRCS ${SOURCES} ${EXAMPLE_SOURCES} ${DEMO_SOURCES} + INCLUDE_DIRS ${LVGL_ROOT_DIR} ${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../ + ${LVGL_ROOT_DIR}/examples ${LVGL_ROOT_DIR}/demos + REQUIRES esp_timer) +endif() - target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE") +target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE") - if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM) - target_compile_definitions(${COMPONENT_LIB} - PUBLIC "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR") - endif() +if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM) + target_compile_definitions(${COMPONENT_LIB} + PUBLIC "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR") endif() diff --git a/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack b/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.11.pack similarity index 86% rename from lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack rename to lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.11.pack index 049a44e..535d45c 100644 Binary files a/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack and b/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.11.pack differ diff --git a/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc b/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc index e5033f3..8c4dde8 100644 --- a/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc +++ b/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc @@ -20,7 +20,7 @@ --> - + LVGL lvgl LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. @@ -36,12 +36,47 @@ https://github.com/lvgl/lvgl.git - - - LVGL 8.3.0 release - - Apply patch for memory leaking issue - - Apply patch to speed up non normal blend mode - - Add 9-key input mode to pinyin - - Other minor changes + + - LVGL 8.3.11 + - Add LittleFS Library to LVGL8 + - Backport Tiny TTF to LVGL8 + - Some minor fixes + + + - LVGL 8.3.10 + - Some minor fixes + + + + - LVGL 8.3.10 + - Add snapshot, fragment, imgfont, gridnav, msg and monkey + - Other minor fixes + + + - LVGL 8.3.8 + - Add renesas-ra6m3 gpu adaptation + - Improve performance and add more features for PXP and VGLite + - Minor updates + + + - LVGL 8.3.7 + - Minor updates + + + - LVGL 8.3.6 release + - Various fixes, See CHANGELOG.md + + + - LVGL 8.3.5 release + - Use LVGL version as the cmsis-pack version + - Fix GPU support for NXP PXP and NXP VGLite + - Rework stm32 DMA2D support + - Various fixes + + + - LVGL 8.3.4 release + - Update GPU Arm-2D support + - Various fixes - LVGL 8.3.0-dev @@ -159,6 +194,90 @@ + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + - + LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. @@ -324,10 +443,18 @@ - + + + + + + + + + @@ -360,7 +487,7 @@ - + A 2D image processing library from Arm (i.e. Arm-2D) for All Cortex-M processors including Cortex-M0 @@ -375,7 +502,7 @@ - + An hardware acceleration from STM32-DMA2D @@ -389,7 +516,7 @@ - + An hardware acceleration from SWM341-DMA2D @@ -403,13 +530,13 @@ - + An hardware acceleration from NXP-PXP - - - - + + + + @@ -420,14 +547,16 @@ - + An hardware acceleration from NXP-VGLite - - - - - + + + + + + + @@ -438,6 +567,22 @@ + + + An hardware acceleration from Renesas RA6M3-G2D + + + + + + + +/*! \brief enable RA6M3-G2D */ +#define LV_USE_GPU_RA6M3_G2D 1 + + + + Extra Themes, Widgets and Layouts @@ -583,10 +728,27 @@ + + + + + + + Add Tiny TTF Library + + + + + +/*! \brief enable Tiny TTF Library */ +#define LV_USE_TINY_TTF 1 + + + Add RLOTTIE support, an extra librbary is required. @@ -597,7 +759,7 @@ /*! \brief enable RLOTTIE support */ -#define LV_USE_RLOTTIE 1 +#define LV_USE_RLOTTIE 1 @@ -612,7 +774,7 @@ /*! \brief enable ffmpeg support */ -#define LV_USE_FFMPEG 1 +#define LV_USE_FFMPEG 1 @@ -627,7 +789,98 @@ /*! \brief enable ffmpeg support */ -#define LV_USE_IME_PINYIN 1 +#define LV_USE_IME_PINYIN 1 + + + + + + Add the Snapshot service + + + + + + + +/*! \brief enable snapshot support */ +#define LV_USE_SNAPSHOT 1 + + + + + + Add the Fragment service + + + + + + + + +/*! \brief enable fragment support */ +#define LV_USE_FRAGMENT 1 + + + + + + Add the Grid Navigation service + + + + + + + +/*! \brief enable the Grid Navigation support*/ +#define LV_USE_GRIDNAV 1 + + + + + + Add the Image Font service + + + + + + + +/*! \brief enable the image font support*/ +#define LV_USE_IMGFONT 1 + + + + + + Add the Monkey service + + + + + + + +/*! \brief enable the monkey service support*/ +#define LV_USE_MONKEY 1 + + + + + + Add the Message service + + + + + + + +/*! \brief enable the message service support*/ +#define LV_USE_MSG 1 @@ -656,7 +909,7 @@ /*! \brief enable demo:bencharmk */ -#define LV_USE_DEMO_BENCHMARK 1 +#define LV_USE_DEMO_BENCHMARK 1 @@ -676,7 +929,7 @@ /*! \brief enable demo:widgets support */ -#define LV_USE_DEMO_WIDGETS 1 +#define LV_USE_DEMO_WIDGETS 1 diff --git a/lib/lvgl/env_support/cmsis-pack/LVGL.pidx b/lib/lvgl/env_support/cmsis-pack/LVGL.pidx index ddfc008..0ee6be1 100644 --- a/lib/lvgl/env_support/cmsis-pack/LVGL.pidx +++ b/lib/lvgl/env_support/cmsis-pack/LVGL.pidx @@ -2,8 +2,8 @@ LVGL https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/ - 2022-07-06T00:09:27 + 2023-12-09 - + \ No newline at end of file diff --git a/lib/lvgl/env_support/cmsis-pack/README.md b/lib/lvgl/env_support/cmsis-pack/README.md index 5a73e4e..911d38d 100644 --- a/lib/lvgl/env_support/cmsis-pack/README.md +++ b/lib/lvgl/env_support/cmsis-pack/README.md @@ -46,12 +46,33 @@ remove the misleading guide above this code segment. - LV_USE_GPU_SWM341_DMA2D - LV_USE_GPU_ARM2D - LV_USE_IME_PINYIN + - LV_USE_PNG + - LV_USE_BMP + - LV_USE_SJPG + - LV_USE_GIF + - LV_USE_QRCODE + - LV_USE_FREETYPE + - LV_USE_TINY_TTF + - LV_USE_RLOTTIE + - LV_USE_FFMPEG + - LV_USE_SNAPSHOT + - LV_USE_MONKEY + - LV_USE_GRIDNAV + - LV_USE_FRAGMENT + - LV_USE_IMGFONT + - LV_USE_MSG + - LV_USE_IME_PINYIN 5. Update macro `LV_ATTRIBUTE_MEM_ALIGN` and `LV_ATTRIBUTE_MEM_ALIGN_SIZE` to force a WORD alignment. ```c #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 4 #define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4))) ``` Update macro `LV_MEM_SIZE` to `(64*1024U)`. + +Update macro `LV_FONT_MONTSERRAT_12` to `1`. + +Update macro `LV_FONT_MONTSERRAT_12` to `1`. + 6. Update Theme related macros: ```c @@ -89,25 +110,41 @@ Update macro `LV_MEM_SIZE` to `(64*1024U)`. #define LV_TICK_CUSTOM 1 #if LV_TICK_CUSTOM extern uint32_t SystemCoreClock; - #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" - - #if __PER_COUNTER_VER__ < 10902ul - #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((uint32_t)get_system_ticks() / (SystemCoreClock / 1000ul)) - #else - #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() - #endif + #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" + #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() #endif /*LV_TICK_CUSTOM*/ #else #define LV_TICK_CUSTOM 0 #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ #endif /*__PERF_COUNTER__*/ ``` -9. Thoroughly remove the `DEMO USAGE` section. -10. Thoroughly remove the '3rd party libraries' section. -10. rename '**lv_conf_template.h**' to '**lv_conf_cmsis.h**'. + + +9. Remove all content in `DEMO USAGE` section but keep the following: + +```c +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#if LV_USE_DEMO_WIDGETS + #define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Benchmark your system*/ +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ + #define LV_DEMO_BENCHMARK_RGB565A8 1 +#endif +``` + + + +10. Thoroughly remove the `3rd party libraries` section. +11. rename '**lv_conf_template.h**' to '**lv_conf_cmsis.h**'. diff --git a/lib/lvgl/env_support/cmsis-pack/gen_pack.sh b/lib/lvgl/env_support/cmsis-pack/gen_pack.sh index dedba34..ff17b5e 100644 --- a/lib/lvgl/env_support/cmsis-pack/gen_pack.sh +++ b/lib/lvgl/env_support/cmsis-pack/gen_pack.sh @@ -21,8 +21,8 @@ if [ `uname -s` = "Linux" ] CMSIS_PACK_PATH="/home/$USER/.arm/Packs/ARM/CMSIS/5.7.0/" PATH_TO_ADD="$CMSIS_PACK_PATH/CMSIS/Utilities/Linux64/" else - CMSIS_PACK_PATH="/C/Users/gabriel/AppData/Local/Arm/Packs/ARM/CMSIS/5.7.0" - PATH_TO_ADD="/C/Program Files (x86)/7-Zip/:$CMSIS_PACK_PATH/CMSIS/Utilities/Win32/:/C/xmllint/" + CMSIS_PACK_PATH="/C/Users/$USER/AppData/Local/Arm/Packs/ARM/CMSIS/5.7.0" + PATH_TO_ADD="/C/Program Files (x86)/7-Zip/:/C/Program Files/7-Zip/:$CMSIS_PACK_PATH/CMSIS/Utilities/Win32/:/C/xmllint/" fi [[ ":$PATH:" != *":$PATH_TO_ADD}:"* ]] && PATH="${PATH}:${PATH_TO_ADD}" echo $PATH_TO_ADD appended to PATH diff --git a/lib/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h b/lib/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h index cec0fc8..a65a345 100644 --- a/lib/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h +++ b/lib/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.0 + * Configuration file for v8.3.11 */ /* clang-format off */ @@ -76,28 +76,28 @@ /*Input device read period in milliseconds*/ #define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + /*Use a custom tick source that tells the elapsed time in milliseconds. *It removes the need to manually update the tick with `lv_tick_inc()`)*/ #ifdef __PERF_COUNTER__ #define LV_TICK_CUSTOM 1 #if LV_TICK_CUSTOM extern uint32_t SystemCoreClock; - #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" - - #if __PER_COUNTER_VER__ < 10902ul - #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((uint32_t)get_system_ticks() / (SystemCoreClock / 1000ul)) - #else - #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() - #endif + #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" + #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() #endif /*LV_TICK_CUSTOM*/ #else #define LV_TICK_CUSTOM 0 #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ #endif /*__PERF_COUNTER__*/ + /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. *(Not so important, you can adjust it to modify default sizes and spaces)*/ #define LV_DPI_DEF 130 /*[px/inch]*/ @@ -180,13 +180,21 @@ * GPU *-----------*/ + /*Use STM32's DMA2D (aka Chrom Art) GPU*/ #if LV_USE_GPU_STM32_DMA2D /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ #define LV_GPU_DMA2D_CMSIS_INCLUDE #endif +/*Enable RA6M3 G2D GPU*/ +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + /*Use SWM341's DMA2D GPU*/ #if LV_USE_GPU_SWM341_DMA2D #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" @@ -202,16 +210,6 @@ #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 #endif -/*Use SDL renderer API*/ -#define LV_USE_GPU_SDL 0 -#if LV_USE_GPU_SDL - #define LV_GPU_SDL_INCLUDE_PATH - /*Texture cache size, 8MB by default*/ - #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) - /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ - #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) -#endif - /*------------- * Logging *-----------*/ @@ -350,9 +348,9 @@ *https://fonts.google.com/specimen/Montserrat*/ #define LV_FONT_MONTSERRAT_8 0 #define LV_FONT_MONTSERRAT_10 0 -#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_12 1 #define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_16 1 #define LV_FONT_MONTSERRAT_18 0 #define LV_FONT_MONTSERRAT_20 0 #define LV_FONT_MONTSERRAT_22 0 @@ -584,7 +582,6 @@ #define LV_USE_THEME_BASIC 0 #define LV_USE_THEME_MONO 0 #endif - /*----------- * Layouts *----------*/ @@ -595,27 +592,85 @@ /*A layout similar to Grid in CSS.*/ #define LV_USE_GRID 1 -/*----------- - * Others - *----------*/ +/*--------------------- + * 3rd party libraries + *--------------------*/ -/*1: Enable API to take snapshot for object*/ -#define LV_USE_SNAPSHOT 0 +/*File system interfaces for common APIs */ -/*1: Enable Monkey test*/ -#define LV_USE_MONKEY 0 +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif -/*1: Enable grid navigation*/ -#define LV_USE_GRIDNAV 0 +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif -/*1: Enable lv_obj fragment*/ -#define LV_USE_FRAGMENT 0 +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif -/*1: Support using images as font in label or span widgets */ -#define LV_USE_IMGFONT 0 +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif -/*1: Enable a published subscriber based messaging system */ -#define LV_USE_MSG 0 + + +/*FreeType library*/ +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Tiny TTF library*/ +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ /*1: Enable Pinyin input method*/ /*Requires: lv_keyboard*/ @@ -641,6 +696,20 @@ /*Enable the examples to be built with the library*/ #define LV_BUILD_EXAMPLES 1 +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#if LV_USE_DEMO_WIDGETS + #define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Benchmark your system*/ +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ + #define LV_DEMO_BENCHMARK_RGB565A8 1 +#endif /*--END OF LV_CONF_H--*/ diff --git a/lib/lvgl/env_support/rt-thread/lv_rt_thread_conf.h b/lib/lvgl/env_support/rt-thread/lv_rt_thread_conf.h index 92da372..c1458be 100644 --- a/lib/lvgl/env_support/rt-thread/lv_rt_thread_conf.h +++ b/lib/lvgl/env_support/rt-thread/lv_rt_thread_conf.h @@ -71,7 +71,11 @@ # define LV_BIG_ENDIAN_SYSTEM 0 #endif -#define LV_ATTRIBUTE_MEM_ALIGN ALIGN(4) +#ifdef rt_align /* >= RT-Thread v5.0.0 */ +# define LV_ATTRIBUTE_MEM_ALIGN rt_align(RT_ALIGN_SIZE) +#else +# define LV_ATTRIBUTE_MEM_ALIGN ALIGN(RT_ALIGN_SIZE) +#endif /*================== * EXAMPLES diff --git a/lib/lvgl/env_support/rt-thread/lv_rt_thread_port.c b/lib/lvgl/env_support/rt-thread/lv_rt_thread_port.c index 97027f0..b28ea30 100644 --- a/lib/lvgl/env_support/rt-thread/lv_rt_thread_port.c +++ b/lib/lvgl/env_support/rt-thread/lv_rt_thread_port.c @@ -31,6 +31,12 @@ extern void lv_port_indev_init(void); extern void lv_user_gui_init(void); static struct rt_thread lvgl_thread; + +#ifdef rt_align +rt_align(RT_ALIGN_SIZE) +#else +ALIGN(RT_ALIGN_SIZE) +#endif static rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE]; #if LV_USE_LOG @@ -63,7 +69,7 @@ static int lvgl_thread_init(void) rt_err_t err; err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL, - &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 0); + &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10); if(err != RT_EOK) { LOG_E("Failed to create LVGL thread"); diff --git a/lib/lvgl/env_support/rt-thread/squareline/README.md b/lib/lvgl/env_support/rt-thread/squareline/README.md new file mode 100644 index 0000000..e55796b --- /dev/null +++ b/lib/lvgl/env_support/rt-thread/squareline/README.md @@ -0,0 +1,4 @@ +This folder is for LVGL SquareLine Studio + +SquareLine Studio can automatically put the generated C files into `ui` folder, so that rt-thread will automatically detect them; or, as a user, you can move the generated C files into `ui` folder manually. + diff --git a/lib/lvgl/env_support/rt-thread/squareline/SConscript b/lib/lvgl/env_support/rt-thread/squareline/SConscript new file mode 100644 index 0000000..2818830 --- /dev/null +++ b/lib/lvgl/env_support/rt-thread/squareline/SConscript @@ -0,0 +1,25 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +inc = [cwd] + +# check if .h or .hpp files exsit +def check_h_hpp_exsit(path): + file_dirs = os.listdir(path) + for file_dir in file_dirs: + if os.path.splitext(file_dir)[1] in ['.h', '.hpp']: + return True + return False + +sls_src_cwd = cwd +for root, dirs, files in os.walk(sls_src_cwd): + for dir in dirs: + current_path = os.path.join(root, dir) + src = src + Glob(os.path.join(current_path,'*.c')) # add all .c files + if check_h_hpp_exsit(current_path): # add .h and .hpp path + inc = inc + [current_path] + +group = DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'], CPPPATH = inc) + +Return('group') diff --git a/lib/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c b/lib/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c new file mode 100644 index 0000000..f08e1f5 --- /dev/null +++ b/lib/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2022-05-13 Meco Man First version + */ + +#ifdef __RTTHREAD__ + +void lv_user_gui_init(void) +{ + extern void ui_init(void); + ui_init(); +} + +#endif /* __RTTHREAD__ */ diff --git a/lib/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h b/lib/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h new file mode 100644 index 0000000..f2d518f --- /dev/null +++ b/lib/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2022-11-20 Meco Man The first version + */ + +#ifdef __RTTHREAD__ + +#include "../../../../../lvgl.h" /* back to the root folder's lvgl.h */ + +#endif /* __RTTHREAD__ */ diff --git a/lib/lvgl/examples/anim/lv_example_anim_3.c b/lib/lvgl/examples/anim/lv_example_anim_3.c index 4692878..dedcad9 100644 --- a/lib/lvgl/examples/anim/lv_example_anim_3.c +++ b/lib/lvgl/examples/anim/lv_example_anim_3.c @@ -1,5 +1,5 @@ #include "../lv_examples.h" -#if LV_BUILD_EXAMPLES && LV_USE_SLIDER && LV_USE_CHART && LV_USE_BTN +#if LV_BUILD_EXAMPLES && LV_USE_SLIDER && LV_USE_CHART && LV_USE_BTN && LV_USE_GRID /** * the example show the use of cubic-bezier3 in animation. diff --git a/lib/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino b/lib/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino index 7c40ae8..7aeccbb 100644 --- a/lib/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino +++ b/lib/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino @@ -1,19 +1,20 @@ +/*Using LVGL with Arduino requires some extra steps: + *Be sure to read the docs here: https://docs.lvgl.io/master/get-started/platforms/arduino.html */ + #include #include -/*If you want to use the LVGL examples, - make sure to install the lv_examples Arduino library - and uncomment the following line. -#include -*/ -#include +/*To use the built-in examples and demos of LVGL uncomment the includes below respectively. + *You also need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`. + Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8) + as the examples and demos are now part of the main LVGL library. */ /*Change to your screen resolution*/ static const uint16_t screenWidth = 480; static const uint16_t screenHeight = 320; static lv_disp_draw_buf_t draw_buf; -static lv_color_t buf[ screenWidth * 10 ]; +static lv_color_t buf[ screenWidth * screenHeight / 10 ]; TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */ @@ -27,7 +28,7 @@ void my_print(const char * buf) #endif /* Display flushing */ -void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p ) +void my_disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p ) { uint32_t w = ( area->x2 - area->x1 + 1 ); uint32_t h = ( area->y2 - area->y1 + 1 ); @@ -37,11 +38,11 @@ void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *colo tft.pushColors( ( uint16_t * )&color_p->full, w * h, true ); tft.endWrite(); - lv_disp_flush_ready( disp ); + lv_disp_flush_ready( disp_drv ); } /*Read the touchpad*/ -void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data ) +void my_touchpad_read( lv_indev_drv_t * indev_drv, lv_indev_data_t * data ) { uint16_t touchX, touchY; @@ -92,7 +93,7 @@ void setup() uint16_t calData[5] = { 275, 3620, 264, 3532, 1 }; tft.setTouch( calData ); - lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 ); + lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * screenHeight / 10 ); /*Initialize the display*/ static lv_disp_drv_t disp_drv; @@ -110,26 +111,25 @@ void setup() indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = my_touchpad_read; lv_indev_drv_register( &indev_drv ); - -#if 0 + /* Create simple label */ lv_obj_t *label = lv_label_create( lv_scr_act() ); - lv_label_set_text( label, LVGL_Arduino.c_str() ); + lv_label_set_text( label, "Hello Ardino and LVGL!"); lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 ); -#else - /* Try an example from the lv_examples Arduino library - make sure to include it as written above. - lv_example_btn_1(); - */ - - // uncomment one of these demos - lv_demo_widgets(); // OK - // lv_demo_benchmark(); // OK - // lv_demo_keypad_encoder(); // works, but I haven't an encoder - // lv_demo_music(); // NOK + + /* Try an example. See all the examples + * online: https://docs.lvgl.io/master/examples.html + * source codes: https://github.com/lvgl/lvgl/tree/e7f88efa5853128bf871dde335c0ca8da9eb7731/examples */ + //lv_example_btn_1(); + + /*Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMOS_WIDGETS*/ + //lv_demo_widgets(); + // lv_demo_benchmark(); + // lv_demo_keypad_encoder(); + // lv_demo_music(); // lv_demo_printer(); - // lv_demo_stress(); // seems to be OK -#endif + // lv_demo_stress(); + Serial.println( "Setup done" ); } diff --git a/lib/lvgl/examples/layouts/flex/lv_example_flex_1.c b/lib/lvgl/examples/layouts/flex/lv_example_flex_1.c index 6363d37..94cfe25 100644 --- a/lib/lvgl/examples/layouts/flex/lv_example_flex_1.c +++ b/lib/lvgl/examples/layouts/flex/lv_example_flex_1.c @@ -28,7 +28,7 @@ void lv_example_flex_1(void) lv_obj_set_size(obj, 100, LV_PCT(100)); label = lv_label_create(obj); - lv_label_set_text_fmt(label, "Item: %u", i); + lv_label_set_text_fmt(label, "Item: %"LV_PRIu32, i); lv_obj_center(label); /*Add items to the column*/ diff --git a/lib/lvgl/examples/lv_examples.mk b/lib/lvgl/examples/lv_examples.mk index b8fa7eb..2586e33 100644 --- a/lib/lvgl/examples/lv_examples.mk +++ b/lib/lvgl/examples/lv_examples.mk @@ -1 +1 @@ -CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name \*.c) +CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name "*.c") diff --git a/lib/lvgl/examples/widgets/animimg/lv_example_animimg_1.c b/lib/lvgl/examples/widgets/animimg/lv_example_animimg_1.c index 84ea965..4341b6f 100644 --- a/lib/lvgl/examples/widgets/animimg/lv_example_animimg_1.c +++ b/lib/lvgl/examples/widgets/animimg/lv_example_animimg_1.c @@ -14,7 +14,7 @@ void lv_example_animimg_1(void) { lv_obj_t * animimg0 = lv_animimg_create(lv_scr_act()); lv_obj_center(animimg0); - lv_animimg_set_src(animimg0, (lv_img_dsc_t **) anim_imgs, 3); + lv_animimg_set_src(animimg0, (const void **) anim_imgs, 3); lv_animimg_set_duration(animimg0, 1000); lv_animimg_set_repeat_count(animimg0, LV_ANIM_REPEAT_INFINITE); lv_animimg_start(animimg0); diff --git a/lib/lvgl/examples/widgets/menu/lv_example_menu_4.c b/lib/lvgl/examples/widgets/menu/lv_example_menu_4.c index 5807e5d..7c96db5 100644 --- a/lib/lvgl/examples/widgets/menu/lv_example_menu_4.c +++ b/lib/lvgl/examples/widgets/menu/lv_example_menu_4.c @@ -18,11 +18,11 @@ static void float_btn_event_cb(lv_event_t * e) cont = lv_menu_cont_create(sub_page); label = lv_label_create(cont); - lv_label_set_text_fmt(label, "Hello, I am hiding inside %i", btn_cnt); + lv_label_set_text_fmt(label, "Hello, I am hiding inside %"LV_PRIu32, btn_cnt); cont = lv_menu_cont_create(main_page); label = lv_label_create(cont); - lv_label_set_text_fmt(label, "Item %i", btn_cnt); + lv_label_set_text_fmt(label, "Item %"LV_PRIu32, btn_cnt); lv_menu_set_load_page_event(menu, cont, sub_page); lv_obj_scroll_to_view_recursive(cont, LV_ANIM_ON); diff --git a/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.c b/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.c index 0266042..79f306b 100644 --- a/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.c +++ b/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.c @@ -1,21 +1,11 @@ #include "../../lv_examples.h" #if LV_USE_TABVIEW && LV_BUILD_EXAMPLES -static void scroll_begin_event(lv_event_t * e) -{ - /*Disable the scroll animations. Triggered when a tab button is clicked */ - if(lv_event_get_code(e) == LV_EVENT_SCROLL_BEGIN) { - lv_anim_t * a = lv_event_get_param(e); - if(a) a->time = 0; - } -} - void lv_example_tabview_2(void) { /*Create a Tab view object*/ lv_obj_t * tabview; tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 80); - lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_BEGIN, NULL); lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_RED, 2), 0); diff --git a/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.py b/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.py index f1604be..ee0360e 100644 --- a/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.py +++ b/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.py @@ -1,15 +1,6 @@ -def scroll_begin_event(e): - - #Disable the scroll animations. Triggered when a tab button is clicked */ - if e.get_code() == lv.EVENT.SCROLL_BEGIN: - a = lv.anim_t.__cast__(e.get_param()) - if a: - a.time = 0 # Create a Tab view object tabview = lv.tabview(lv.scr_act(), lv.DIR.LEFT, 80) -tabview.get_content().add_event_cb(scroll_begin_event, lv.EVENT.SCROLL_BEGIN, None) - tabview.set_style_bg_color(lv.palette_lighten(lv.PALETTE.RED, 2), 0) tab_btns = tabview.get_tab_btns() diff --git a/lib/lvgl/idf_component.yml b/lib/lvgl/idf_component.yml index 50fe06e..9b1a2e2 100644 --- a/lib/lvgl/idf_component.yml +++ b/lib/lvgl/idf_component.yml @@ -1,2 +1,5 @@ -description: LVGL - Light and Versatile Graphics Library -url: https://github.com/lvgl/lvgl \ No newline at end of file +description: LVGL - Light and Versatile Graphics Library +url: https://lvgl.io/ +repository: https://github.com/lvgl/lvgl.git +documentation: https://docs.lvgl.io/ +issues: https://github.com/lvgl/lvgl/issues diff --git a/lib/lvgl/library.json b/lib/lvgl/library.json index f92a5de..11697d7 100644 --- a/lib/lvgl/library.json +++ b/lib/lvgl/library.json @@ -1,6 +1,6 @@ { "name": "lvgl", - "version": "8.3.1", + "version": "8.3.11", "keywords": "graphics, gui, embedded, tft, lvgl", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "repository": { diff --git a/lib/lvgl/library.properties b/lib/lvgl/library.properties index fbe413f..bc74115 100644 --- a/lib/lvgl/library.properties +++ b/lib/lvgl/library.properties @@ -1,5 +1,5 @@ name=lvgl -version=8.3.1 +version=8.3.11 author=kisvegabor maintainer=kisvegabor,embeddedt,pete-pjb sentence=Full-featured Graphics Library for Embedded Systems diff --git a/lib/lvgl/lv_conf_template.h b/lib/lvgl/lv_conf_template.h index b9382c0..bed77fb 100644 --- a/lib/lvgl/lv_conf_template.h +++ b/lib/lvgl/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.1 + * Configuration file for v8.3.11 */ /* @@ -89,6 +89,9 @@ #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. @@ -180,10 +183,18 @@ #define LV_USE_GPU_STM32_DMA2D 0 #if LV_USE_GPU_STM32_DMA2D /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ #define LV_GPU_DMA2D_CMSIS_INCLUDE #endif +/*Enable RA6M3 G2D GPU*/ +#define LV_USE_GPU_RA6M3_G2D 0 +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + /*Use SWM341's DMA2D GPU*/ #define LV_USE_GPU_SWM341_DMA2D 0 #if LV_USE_GPU_SWM341_DMA2D @@ -628,6 +639,13 @@ #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ #endif +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + /*PNG decoder library*/ #define LV_USE_PNG 0 @@ -661,6 +679,13 @@ #endif #endif +/*Tiny TTF library*/ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + /*Rlottie library*/ #define LV_USE_RLOTTIE 0 diff --git a/lib/lvgl/lvgl.h b/lib/lvgl/lvgl.h index 4cd9a83..47700d4 100644 --- a/lib/lvgl/lvgl.h +++ b/lib/lvgl/lvgl.h @@ -15,7 +15,7 @@ extern "C" { ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINOR 3 -#define LVGL_VERSION_PATCH 1 +#define LVGL_VERSION_PATCH 11 #define LVGL_VERSION_INFO "" /********************* diff --git a/lib/lvgl/scripts/build_html_examples.sh b/lib/lvgl/scripts/build_html_examples.sh index 4c66ed7..ae8b631 100755 --- a/lib/lvgl/scripts/build_html_examples.sh +++ b/lib/lvgl/scripts/build_html_examples.sh @@ -6,6 +6,7 @@ rm -rf emscripten_builder git clone https://github.com/lvgl/lv_sim_emscripten.git emscripten_builder scripts/genexamplelist.sh > emscripten_builder/examplelist.c cd emscripten_builder +git checkout 45e0bc5c8d3e55cfbcaf8214361d2335b8b9a7b4 git submodule update --init -- lvgl cd lvgl git checkout $CURRENT_REF diff --git a/lib/lvgl/scripts/style_api_gen.py b/lib/lvgl/scripts/style_api_gen.py index 5bcdded..2765cce 100755 --- a/lib/lvgl/scripts/style_api_gen.py +++ b/lib/lvgl/scripts/style_api_gen.py @@ -163,7 +163,7 @@ props = [ {'name': 'BORDER_WIDTH', 'style_type': 'num', 'var_type': 'lv_coord_t' , 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 0, - 'dsc': "Set hte width of the border. Only pixel values can be used."}, + 'dsc': "Set the width of the border. Only pixel values can be used."}, {'name': 'BORDER_SIDE', 'style_type': 'num', 'var_type': 'lv_border_side_t', 'default':'`LV_BORDER_SIDE_NONE`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, @@ -316,6 +316,10 @@ props = [ 'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_COVER`', 'inherited': 1, 'layout': 0, 'ext_draw': 0, 'dsc': "Scale down all opacity values of the object by this factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency." }, +{'name': 'OPA_LAYERED', + 'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_COVER`', 'inherited': 1, 'layout': 0, 'ext_draw': 0, + 'dsc': "First draw the object on the layer, then scale down layer opacity factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency." }, + {'name': 'COLOR_FILTER_DSC', 'style_type': 'ptr', 'var_type': 'const lv_color_filter_dsc_t *', 'default':'`NULL`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'dsc': "Mix a color to all colors of the object." }, @@ -346,7 +350,7 @@ props = [ {'name': 'LAYOUT', 'style_type': 'num', 'var_type': 'uint16_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 0, - 'dsc': "Set the layout if the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts."}, + 'dsc': "Set the layout of the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts."}, {'name': 'BASE_DIR', 'style_type': 'num', 'var_type': 'lv_base_dir_t', 'default':'`LV_BASE_DIR_AUTO`', 'inherited': 1, 'layout': 1, 'ext_draw': 0, diff --git a/lib/lvgl/src/core/lv_disp.c b/lib/lvgl/src/core/lv_disp.c index a1022b5..cacade5 100644 --- a/lib/lvgl/src/core/lv_disp.c +++ b/lib/lvgl/src/core/lv_disp.c @@ -224,9 +224,13 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t lv_disp_t * d = lv_obj_get_disp(new_scr); lv_obj_t * act_scr = lv_scr_act(); + if(act_scr == new_scr || d->scr_to_load == new_scr) { + return; + } + /*If an other screen load animation is in progress *make target screen loaded immediately. */ - if(d->scr_to_load && act_scr != d->scr_to_load) { + if(d->scr_to_load) { scr_load_internal(d->scr_to_load); lv_anim_del(d->scr_to_load, NULL); lv_obj_set_pos(d->scr_to_load, 0, 0); @@ -258,10 +262,10 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0); lv_obj_remove_local_style_prop(lv_scr_act(), LV_STYLE_OPA, 0); - /*Shortcut for immediate load*/ if(time == 0 && delay == 0) { scr_load_internal(new_scr); + if(auto_del) lv_obj_del(act_scr); return; } @@ -477,6 +481,7 @@ static void scr_load_internal(lv_obj_t * scr) if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOAD_START, NULL); d->act_scr = scr; + d->scr_to_load = NULL; if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOADED, NULL); if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL); diff --git a/lib/lvgl/src/core/lv_group.c b/lib/lvgl/src/core/lv_group.c index 242c9d1..63fde71 100644 --- a/lib/lvgl/src/core/lv_group.c +++ b/lib/lvgl/src/core/lv_group.c @@ -92,6 +92,7 @@ void lv_group_del(lv_group_t * group) indev = lv_indev_get_next(indev); } + if(default_group == group) default_group = NULL; _lv_ll_clear(&(group->obj_ll)); _lv_ll_remove(&LV_GC_ROOT(_lv_group_ll), group); lv_mem_free(group); @@ -113,6 +114,9 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) LV_LOG_TRACE("begin"); + /*Be sure the object is removed from its current group*/ + lv_group_remove_obj(obj); + /*Do not add the object twice*/ lv_obj_t ** obj_i; _LV_LL_READ(&group->obj_ll, obj_i) { diff --git a/lib/lvgl/src/core/lv_indev.c b/lib/lvgl/src/core/lv_indev.c index ab1265e..9192f84 100644 --- a/lib/lvgl/src/core/lv_indev.c +++ b/lib/lvgl/src/core/lv_indev.c @@ -356,16 +356,16 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) /*Simple sanity check*/ if(data->point.x < 0) { - LV_LOG_WARN("X is %d which is smaller than zero", data->point.x); + LV_LOG_WARN("X is %d which is smaller than zero", (int)data->point.x); } if(data->point.x >= lv_disp_get_hor_res(i->driver->disp)) { - LV_LOG_WARN("X is %d which is greater than hor. res", data->point.x); + LV_LOG_WARN("X is %d which is greater than hor. res", (int)data->point.x); } if(data->point.y < 0) { - LV_LOG_WARN("Y is %d which is smaller than zero", data->point.y); + LV_LOG_WARN("Y is %d which is smaller than zero", (int)data->point.y); } if(data->point.y >= lv_disp_get_ver_res(i->driver->disp)) { - LV_LOG_WARN("Y is %d which is greater than ver. res", data->point.y); + LV_LOG_WARN("Y is %d which is greater than ver. res", (int)data->point.y); } /*Move the cursor if set and moved*/ @@ -852,8 +852,6 @@ static void indev_proc_press(_lv_indev_proc_t * proc) if(indev_reset_check(proc)) return; } - lv_obj_transform_point(indev_obj_act, &proc->types.pointer.act_point, true, true); - /*If a new object was found reset some variables and send a pressed event handler*/ if(indev_obj_act != proc->types.pointer.act_obj) { proc->types.pointer.last_point.x = proc->types.pointer.act_point.x; @@ -987,6 +985,27 @@ static void indev_proc_release(_lv_indev_proc_t * proc) proc->pr_timestamp = 0; proc->longpr_rep_timestamp = 0; + + /*Get the transformed vector with this object*/ + if(scroll_obj) { + int16_t angle = 0; + int16_t zoom = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_angle(parent, 0); + zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256); + parent = lv_obj_get_parent(parent); + } + + if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) { + angle = -angle; + zoom = (256 * 256) / zoom; + lv_point_transform(&proc->types.pointer.scroll_throw_vect, angle, zoom, &pivot); + lv_point_transform(&proc->types.pointer.scroll_throw_vect_ori, angle, zoom, &pivot); + } + } + } /*The reset can be set in the Call the ancestor's event handler function. diff --git a/lib/lvgl/src/core/lv_indev_scroll.c b/lib/lvgl/src/core/lv_indev_scroll.c index c05e345..8a36ab3 100644 --- a/lib/lvgl/src/core/lv_indev_scroll.c +++ b/lib/lvgl/src/core/lv_indev_scroll.c @@ -45,12 +45,13 @@ static lv_coord_t elastic_diff(lv_obj_t * scroll_obj, lv_coord_t diff, lv_coord_ void _lv_indev_scroll_handler(_lv_indev_proc_t * proc) { + if(proc->types.pointer.vect.x == 0 && proc->types.pointer.vect.y == 0) { + return; + } + lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj; /*If there is no scroll object yet try to find one*/ if(scroll_obj == NULL) { - proc->types.pointer.scroll_sum.x += proc->types.pointer.vect.x; - proc->types.pointer.scroll_sum.y += proc->types.pointer.vect.y; - scroll_obj = find_scroll_obj(proc); if(scroll_obj == NULL) return; @@ -61,35 +62,50 @@ void _lv_indev_scroll_handler(_lv_indev_proc_t * proc) } /*Set new position or scroll if the vector is not zero*/ - if(proc->types.pointer.vect.x != 0 || proc->types.pointer.vect.y != 0) { - lv_coord_t diff_x = 0; - lv_coord_t diff_y = 0; + int16_t angle = 0; + int16_t zoom = 256; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_angle(parent, 0); + zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256); + parent = lv_obj_get_parent(parent); + } - if(proc->types.pointer.scroll_dir == LV_DIR_HOR) { - lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); - lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); - diff_x = elastic_diff(scroll_obj, proc->types.pointer.vect.x, sl, sr, LV_DIR_HOR); - } - else { - lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); - lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); - diff_y = elastic_diff(scroll_obj, proc->types.pointer.vect.y, st, sb, LV_DIR_VER); - } + if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) { + angle = -angle; + zoom = (256 * 256) / zoom; + lv_point_t pivot = { 0, 0 }; + lv_point_transform(&proc->types.pointer.vect, angle, zoom, &pivot); + } - lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); - if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; - if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; - if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; - if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; - /*Respect the scroll limit area*/ - scroll_limit_diff(proc, &diff_x, &diff_y); - _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); - if(proc->reset_query) return; - proc->types.pointer.scroll_sum.x += diff_x; - proc->types.pointer.scroll_sum.y += diff_y; + lv_coord_t diff_x = 0; + lv_coord_t diff_y = 0; + if(proc->types.pointer.scroll_dir == LV_DIR_HOR) { + lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); + lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); + diff_x = elastic_diff(scroll_obj, proc->types.pointer.vect.x, sl, sr, LV_DIR_HOR); + } + else { + lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); + lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); + diff_y = elastic_diff(scroll_obj, proc->types.pointer.vect.y, st, sb, LV_DIR_VER); } + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); + if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; + + /*Respect the scroll limit area*/ + scroll_limit_diff(proc, &diff_x, &diff_y); + + _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + if(proc->reset_query) return; + proc->types.pointer.scroll_sum.x += diff_x; + proc->types.pointer.scroll_sum.y += diff_y; } @@ -99,7 +115,6 @@ void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc) if(scroll_obj == NULL) return; if(proc->types.pointer.scroll_dir == LV_DIR_NONE) return; - lv_indev_t * indev_act = lv_indev_get_act(); lv_coord_t scroll_throw = indev_act->driver->scroll_throw; @@ -259,14 +274,37 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) /*Decide if it's a horizontal or vertical scroll*/ bool hor_en = false; bool ver_en = false; - if(LV_ABS(proc->types.pointer.scroll_sum.x) > LV_ABS(proc->types.pointer.scroll_sum.y)) { - hor_en = true; - } - else { - ver_en = true; - } + + proc->types.pointer.scroll_sum.x += proc->types.pointer.vect.x; + proc->types.pointer.scroll_sum.y += proc->types.pointer.vect.y; while(obj_act) { + /*Get the transformed scroll_sum with this object*/ + int16_t angle = 0; + int32_t zoom = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = obj_act; + while(parent) { + angle += lv_obj_get_style_transform_angle(parent, 0); + int32_t zoom_act = lv_obj_get_style_transform_zoom(parent, 0); + zoom = (zoom * zoom_act) >> 8; + parent = lv_obj_get_parent(parent); + } + + lv_point_t obj_scroll_sum = proc->types.pointer.scroll_sum; + if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) { + angle = -angle; + zoom = (256 * 256) / zoom; + lv_point_transform(&obj_scroll_sum, angle, zoom, &pivot); + } + + if(LV_ABS(obj_scroll_sum.x) > LV_ABS(obj_scroll_sum.y)) { + hor_en = true; + } + else { + ver_en = true; + } + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { /*If this object don't want to chain the scroll to the parent stop searching*/ if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; @@ -300,15 +338,15 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) *is propagated to this object it can show at least elastic scroll effect. *But if not hor/ver scrollable do not scroll it at all (so it's not a good candidate)*/ if((st > 0 || sb > 0) && - ((up_en && proc->types.pointer.scroll_sum.y >= scroll_limit) || - (down_en && proc->types.pointer.scroll_sum.y <= - scroll_limit))) { + ((up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit))) { obj_candidate = obj_act; dir_candidate = LV_DIR_VER; } if((sl > 0 || sr > 0) && - ((left_en && proc->types.pointer.scroll_sum.x >= scroll_limit) || - (right_en && proc->types.pointer.scroll_sum.x <= - scroll_limit))) { + ((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit))) { obj_candidate = obj_act; dir_candidate = LV_DIR_HOR; } @@ -318,11 +356,11 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) if(sl <= 0) left_en = false; if(sr <= 0) right_en = false; - /*If the object really can be scrolled into the current direction the use it.*/ - if((left_en && proc->types.pointer.scroll_sum.x >= scroll_limit) || - (right_en && proc->types.pointer.scroll_sum.x <= - scroll_limit) || - (up_en && proc->types.pointer.scroll_sum.y >= scroll_limit) || - (down_en && proc->types.pointer.scroll_sum.y <= - scroll_limit)) { + /*If the object really can be scrolled into the current direction then use it.*/ + if((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit) || + (up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit)) { proc->types.pointer.scroll_dir = hor_en ? LV_DIR_HOR : LV_DIR_VER; break; } diff --git a/lib/lvgl/src/core/lv_obj.c b/lib/lvgl/src/core/lv_obj.c index 8890fcb..f0f4d55 100644 --- a/lib/lvgl/src/core/lv_obj.c +++ b/lib/lvgl/src/core/lv_obj.c @@ -30,6 +30,10 @@ #include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" #endif +#if LV_USE_GPU_RA6M3_G2D + #include "../draw/renesas/lv_gpu_d2_ra6m3.h" +#endif + #if LV_USE_GPU_SWM341_DMA2D #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" #endif @@ -119,6 +123,11 @@ void lv_init(void) lv_draw_stm32_dma2d_init(); #endif +#if LV_USE_GPU_RA6M3_G2D + /*Initialize G2D GPU*/ + lv_draw_ra6m3_g2d_init(); +#endif + #if LV_USE_GPU_SWM341_DMA2D /*Initialize DMA2D GPU*/ lv_draw_swm341_dma2d_init(); @@ -140,9 +149,9 @@ void lv_init(void) lv_img_cache_set_size(LV_IMG_CACHE_DEF_SIZE); #endif /*Test if the IDE has UTF-8 encoding*/ - char * txt = "Á"; + const char * txt = "Á"; - uint8_t * txt_u8 = (uint8_t *)txt; + const uint8_t * txt_u8 = (uint8_t *)txt; if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) { LV_LOG_WARN("The strings have no UTF-8 encoding. Non-ASCII characters won't be displayed."); } @@ -223,12 +232,22 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) bool was_on_layout = lv_obj_is_layout_positioned(obj); + /* We must invalidate the area occupied by the object before we hide it as calls to invalidate hidden objects are ignored */ if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); obj->flags |= f; if(f & LV_OBJ_FLAG_HIDDEN) { - lv_obj_invalidate(obj); + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_group_t * group = lv_obj_get_group(obj); + if(group != NULL) { + lv_group_focus_next(group); + lv_obj_t * next_obj = lv_group_get_focused(group); + if(next_obj != NULL) { + lv_obj_invalidate(next_obj); + } + } + } } if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { @@ -494,6 +513,11 @@ static void lv_obj_draw(lv_event_t * e) return; } + if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + info->res = LV_COVER_RES_COVER; } @@ -678,7 +702,7 @@ static lv_res_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc } } - lv_opa_t opa = lv_obj_get_style_opa(obj, LV_PART_SCROLLBAR); + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_SCROLLBAR); if(opa < LV_OPA_MAX) { dsc->bg_opa = (dsc->bg_opa * opa) >> 8; dsc->border_opa = (dsc->bg_opa * opa) >> 8; @@ -709,9 +733,9 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) } else if(code == LV_EVENT_RELEASED) { lv_obj_clear_state(obj, LV_STATE_PRESSED); - void * param = lv_event_get_param(e); + lv_indev_t * indev = lv_event_get_indev(e); /*Go the checked state if enabled*/ - if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + if(lv_indev_get_scroll_obj(indev) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) lv_obj_add_state(obj, LV_STATE_CHECKED); else lv_obj_clear_state(obj, LV_STATE_CHECKED); @@ -838,6 +862,10 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_obj_mark_layout_as_dirty(obj); } } + else if(code == LV_EVENT_CHILD_DELETED) { + obj->readjust_scroll_after_layout = 1; + lv_obj_mark_layout_as_dirty(obj); + } else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { lv_coord_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN); lv_event_set_ext_draw_size(e, d); diff --git a/lib/lvgl/src/core/lv_obj.h b/lib/lvgl/src/core/lv_obj.h index c89e460..830d122 100644 --- a/lib/lvgl/src/core/lv_obj.h +++ b/lib/lvgl/src/core/lv_obj.h @@ -183,11 +183,13 @@ typedef struct _lv_obj_t { lv_obj_flag_t flags; lv_state_t state; uint16_t layout_inv : 1; + uint16_t readjust_scroll_after_layout : 1; uint16_t scr_layout_inv : 1; uint16_t skip_trans : 1; uint16_t style_cnt : 6; uint16_t h_layout : 1; uint16_t w_layout : 1; + uint16_t being_deleted : 1; } lv_obj_t; diff --git a/lib/lvgl/src/core/lv_obj_draw.c b/lib/lvgl/src/core/lv_obj_draw.c index f2428cd..d906126 100644 --- a/lib/lvgl/src/core/lv_obj_draw.c +++ b/lib/lvgl/src/core/lv_obj_draw.c @@ -38,9 +38,8 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc) { - lv_opa_t opa = LV_OPA_COVER; + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); if(part != LV_PART_MAIN) { - opa = lv_obj_get_style_opa(obj, part); if(opa <= LV_OPA_MIN) { draw_dsc->bg_opa = LV_OPA_TRANSP; draw_dsc->bg_img_opa = LV_OPA_TRANSP; @@ -180,15 +179,12 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t } } #endif - - if(part != LV_PART_MAIN) { - if(opa < LV_OPA_MAX) { - draw_dsc->bg_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->bg_img_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->border_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->outline_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->shadow_opa = (opa * draw_dsc->shadow_opa) >> 8; - } + if(opa < LV_OPA_MAX) { + draw_dsc->bg_opa = (opa * draw_dsc->bg_opa) >> 8; + draw_dsc->bg_img_opa = (opa * draw_dsc->bg_img_opa) >> 8; + draw_dsc->border_opa = (opa * draw_dsc->border_opa) >> 8; + draw_dsc->outline_opa = (opa * draw_dsc->outline_opa) >> 8; + draw_dsc->shadow_opa = (opa * draw_dsc->shadow_opa) >> 8; } } @@ -197,16 +193,15 @@ void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->color = lv_obj_get_style_text_color_filtered(obj, part); draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); @@ -230,16 +225,15 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc->opa = lv_obj_get_style_img_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; + } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->angle = 0; draw_dsc->zoom = LV_IMG_ZOOM_NONE; @@ -260,16 +254,15 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->width = lv_obj_get_style_line_width(obj, part); if(draw_dsc->width == 0) return; @@ -297,16 +290,15 @@ void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; + } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->color = lv_obj_get_style_arc_color_filtered(obj, part); draw_dsc->img_src = lv_obj_get_style_arc_img_src(obj, part); diff --git a/lib/lvgl/src/core/lv_obj_pos.c b/lib/lvgl/src/core/lv_obj_pos.c index a31c11d..c50ea3a 100644 --- a/lib/lvgl/src/core/lv_obj_pos.c +++ b/lib/lvgl/src/core/lv_obj_pos.c @@ -200,7 +200,7 @@ bool lv_obj_refr_size(lv_obj_t * obj) /*Invalidate the new area*/ lv_obj_invalidate(obj); - lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + obj->readjust_scroll_after_layout = 1; /*If the object was out of the parent invalidate the new scrollbar area too. *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ @@ -1137,20 +1137,24 @@ static void layout_update_core(lv_obj_t * obj) layout_update_core(child); } - if(obj->layout_inv == 0) return; + if(obj->layout_inv) { + obj->layout_inv = 0; + lv_obj_refr_size(obj); + lv_obj_refr_pos(obj); - obj->layout_inv = 0; - - lv_obj_refr_size(obj); - lv_obj_refr_pos(obj); - - if(child_cnt > 0) { - uint32_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); - if(layout_id > 0 && layout_id <= layout_cnt) { - void * user_data = LV_GC_ROOT(_lv_layout_list)[layout_id - 1].user_data; - LV_GC_ROOT(_lv_layout_list)[layout_id - 1].cb(obj, user_data); + if(child_cnt > 0) { + uint32_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout_id > 0 && layout_id <= layout_cnt) { + void * user_data = LV_GC_ROOT(_lv_layout_list)[layout_id - 1].user_data; + LV_GC_ROOT(_lv_layout_list)[layout_id - 1].cb(obj, user_data); + } } } + + if(obj->readjust_scroll_after_layout) { + obj->readjust_scroll_after_layout = 0; + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + } } static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv) @@ -1160,9 +1164,21 @@ static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv) if(angle == 0 && zoom == LV_IMG_ZOOM_NONE) return; - lv_point_t pivot; - pivot.x = obj->coords.x1 + lv_obj_get_style_transform_pivot_x(obj, 0); - pivot.y = obj->coords.y1 + lv_obj_get_style_transform_pivot_y(obj, 0); + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, 0), + .y = lv_obj_get_style_transform_pivot_y(obj, 0) + }; + + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + + pivot.x = obj->coords.x1 + pivot.x; + pivot.y = obj->coords.y1 + pivot.y; + if(inv) { angle = -angle; zoom = (256 * 256) / zoom; diff --git a/lib/lvgl/src/core/lv_obj_scroll.h b/lib/lvgl/src/core/lv_obj_scroll.h index e1da245..459389e 100644 --- a/lib/lvgl/src/core/lv_obj_scroll.h +++ b/lib/lvgl/src/core/lv_obj_scroll.h @@ -290,7 +290,7 @@ void lv_obj_get_scrollbar_area(struct _lv_obj_t * obj, lv_area_t * hor, lv_area_ void lv_obj_scrollbar_invalidate(struct _lv_obj_t * obj); /** - * Checked if the content is scrolled "in" and adjusts it to a normal position. + * Checks if the content is scrolled "in" and adjusts it to a normal position. * @param obj pointer to an object * @param anim_en LV_ANIM_ON/OFF */ diff --git a/lib/lvgl/src/core/lv_obj_style.c b/lib/lvgl/src/core/lv_obj_style.c index 86016c4..ecffca9 100644 --- a/lib/lvgl/src/core/lv_obj_style.c +++ b/lib/lvgl/src/core/lv_obj_style.c @@ -314,7 +314,12 @@ bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_sty /*The style is not found*/ if(i == obj->style_cnt) return false; - return lv_style_remove_prop(obj->styles[i].style, prop); + lv_res_t res = lv_style_remove_prop(obj->styles[i].style, prop); + if(res == LV_RES_OK) { + lv_obj_refresh_style(obj, selector, prop); + } + + return res; } void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, @@ -491,6 +496,40 @@ lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, return align; } +lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part) +{ + + lv_opa_t opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; + + lv_opa_t opa_final = LV_OPA_COVER; + if(opa_obj < LV_OPA_MAX) { + opa_final = ((uint32_t)opa_final * opa_obj) >> 8; + } + + if(part != LV_PART_MAIN) { + part = LV_PART_MAIN; + } + else { + obj = lv_obj_get_parent(obj); + } + + while(obj) { + opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; + if(opa_obj < LV_OPA_MAX) { + opa_final = ((uint32_t)opa_final * opa_obj) >> 8; + } + + obj = lv_obj_get_parent(obj); + } + + if(opa_final <= LV_OPA_MIN) return LV_OPA_TRANSP; + if(opa_final >= LV_OPA_MAX) return LV_OPA_COVER; + return opa_final; +} + + /********************** * STATIC FUNCTIONS **********************/ @@ -744,6 +783,7 @@ static void trans_anim_cb(void * _tr, int32_t v) else value_final.ptr = tr->end_value.ptr; break; case LV_STYLE_BG_COLOR: + case LV_STYLE_BG_GRAD_COLOR: case LV_STYLE_BORDER_COLOR: case LV_STYLE_TEXT_COLOR: case LV_STYLE_SHADOW_COLOR: @@ -840,8 +880,7 @@ static lv_layer_type_t calculate_layer_type(lv_obj_t * obj) { if(lv_obj_get_style_transform_angle(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; if(lv_obj_get_style_transform_zoom(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_opa(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; - + if(lv_obj_get_style_opa_layered(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; #if LV_DRAW_COMPLEX if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE; #endif diff --git a/lib/lvgl/src/core/lv_obj_style.h b/lib/lvgl/src/core/lv_obj_style.h index 5d122ca..ecc24db 100644 --- a/lib/lvgl/src/core/lv_obj_style.h +++ b/lib/lvgl/src/core/lv_obj_style.h @@ -236,6 +236,21 @@ static inline void lv_obj_set_style_size(struct _lv_obj_t * obj, lv_coord_t valu lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, lv_part_t part, const char * txt); +static inline lv_coord_t lv_obj_get_style_transform_zoom_safe(const struct _lv_obj_t * obj, uint32_t part) +{ + int16_t zoom = lv_obj_get_style_transform_zoom(obj, part); + return zoom != 0 ? zoom : 1; +} + + +/** + * Get the `opa` style property from all parents and multiply and `>> 8` them. + * @param obj the object whose opacity should be get + * @param part the part whose opacity should be get. Non-MAIN parts will consider the `opa` of teh MAIN part too + * @return the final opacity considering the parents' opacity too + */ +lv_opa_t lv_obj_get_style_opa_recursive(const struct _lv_obj_t * obj, lv_part_t part); + /********************** * MACROS diff --git a/lib/lvgl/src/core/lv_obj_style_gen.c b/lib/lvgl/src/core/lv_obj_style_gen.c index 64a0bb2..81358ab 100644 --- a/lib/lvgl/src/core/lv_obj_style_gen.c +++ b/lib/lvgl/src/core/lv_obj_style_gen.c @@ -600,6 +600,14 @@ void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selec lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector); } +void lv_obj_set_style_opa_layered(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector); +} + void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) { lv_style_value_t v = { diff --git a/lib/lvgl/src/core/lv_obj_style_gen.h b/lib/lvgl/src/core/lv_obj_style_gen.h index 576927d..4a135be 100644 --- a/lib/lvgl/src/core/lv_obj_style_gen.h +++ b/lib/lvgl/src/core/lv_obj_style_gen.h @@ -508,6 +508,12 @@ static inline lv_opa_t lv_obj_get_style_opa(const struct _lv_obj_t * obj, uint32 return (lv_opa_t)v.num; } +static inline lv_opa_t lv_obj_get_style_opa_layered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA_LAYERED); + return (lv_opa_t)v.num; +} + static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, uint32_t part) { lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); @@ -637,6 +643,7 @@ void lv_obj_set_style_text_align(struct _lv_obj_t * obj, lv_text_align_t value, void lv_obj_set_style_radius(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); void lv_obj_set_style_clip_corner(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_opa_layered(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); diff --git a/lib/lvgl/src/core/lv_obj_tree.c b/lib/lvgl/src/core/lv_obj_tree.c index d3ad16a..5ae629e 100644 --- a/lib/lvgl/src/core/lv_obj_tree.c +++ b/lib/lvgl/src/core/lv_obj_tree.c @@ -49,9 +49,6 @@ void lv_obj_del(lv_obj_t * obj) lv_obj_invalidate(obj); lv_obj_t * par = lv_obj_get_parent(obj); - if(par) { - lv_obj_scrollbar_invalidate(par); - } lv_disp_t * disp = NULL; bool act_scr_del = false; @@ -65,8 +62,6 @@ void lv_obj_del(lv_obj_t * obj) /*Call the ancestor's event handler to the parent to notify it about the child delete*/ if(par) { - lv_obj_update_layout(par); - lv_obj_readjust_scroll(par, LV_ANIM_OFF); lv_obj_scrollbar_invalidate(par); lv_event_send(par, LV_EVENT_CHILD_CHANGED, NULL); lv_event_send(par, LV_EVENT_CHILD_DELETED, NULL); @@ -173,7 +168,6 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) obj->parent = parent; /*Notify the original parent because one of its children is lost*/ - lv_obj_readjust_scroll(old_parent, LV_ANIM_OFF); lv_obj_scrollbar_invalidate(old_parent); lv_event_send(old_parent, LV_EVENT_CHILD_CHANGED, obj); lv_event_send(old_parent, LV_EVENT_CHILD_DELETED, NULL); @@ -360,6 +354,8 @@ static void obj_del_core(lv_obj_t * obj) lv_res_t res = lv_event_send(obj, LV_EVENT_DELETE, NULL); if(res == LV_RES_INV) return; + obj->being_deleted = 1; + /*Recursively delete the children*/ lv_obj_t * child = lv_obj_get_child(obj, 0); while(child) { diff --git a/lib/lvgl/src/core/lv_refr.c b/lib/lvgl/src/core/lv_refr.c index e6facfa..bfd2748 100644 --- a/lib/lvgl/src/core/lv_refr.c +++ b/lib/lvgl/src/core/lv_refr.c @@ -53,6 +53,7 @@ typedef struct { **********************/ static void lv_refr_join_area(void); static void refr_invalid_areas(void); +static void refr_sync_areas(void); static void refr_area(const lv_area_t * area_p); static void refr_area_part(lv_draw_ctx_t * draw_ctx); static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); @@ -320,17 +321,23 @@ void _lv_disp_refr_timer(lv_timer_t * tmr) } lv_refr_join_area(); - + refr_sync_areas(); refr_invalid_areas(); - /*If refresh happened ...*/ if(disp_refr->inv_p != 0) { - if(disp_refr->driver->full_refresh) { - lv_area_t disp_area; - lv_area_set(&disp_area, 0, 0, lv_disp_get_hor_res(disp_refr) - 1, lv_disp_get_ver_res(disp_refr) - 1); - disp_refr->driver->draw_ctx->buf_area = &disp_area; - draw_buf_flush(disp_refr); + + /*Copy invalid areas for sync next refresh in double buffered direct mode*/ + if(disp_refr->driver->direct_mode && disp_refr->driver->draw_buf->buf2) { + + uint16_t i; + for(i = 0; i < disp_refr->inv_p; i++) { + if(disp_refr->inv_area_joined[i]) + continue; + + lv_area_t * sync_area = _lv_ll_ins_tail(&disp_refr->sync_areas); + *sync_area = disp_refr->inv_areas[i]; + } } /*Clean up*/ @@ -502,6 +509,78 @@ static void lv_refr_join_area(void) } } +/** + * Refresh the sync areas + */ +static void refr_sync_areas(void) +{ + /*Do not sync if not direct mode*/ + if(!disp_refr->driver->direct_mode) return; + + /*Do not sync if not double buffered*/ + if(disp_refr->driver->draw_buf->buf2 == NULL) return; + + /*Do not sync if no sync areas*/ + if(_lv_ll_is_empty(&disp_refr->sync_areas)) return; + + /*The buffers are already swapped. + *So the active buffer is the off screen buffer where LVGL will render*/ + void * buf_off_screen = disp_refr->driver->draw_buf->buf_act; + void * buf_on_screen = disp_refr->driver->draw_buf->buf_act == disp_refr->driver->draw_buf->buf1 + ? disp_refr->driver->draw_buf->buf2 + : disp_refr->driver->draw_buf->buf1; + + /*Get stride for buffer copy*/ + lv_coord_t stride = lv_disp_get_hor_res(disp_refr); + + /*Iterate through invalidated areas to see if sync area should be copied*/ + lv_area_t res[4] = {0}; + int8_t res_c, j; + uint32_t i; + lv_area_t * sync_area, *new_area, *next_area; + for(i = 0; i < disp_refr->inv_p; i++) { + /*Skip joined areas*/ + if(disp_refr->inv_area_joined[i]) continue; + + /*Iterate over sync areas*/ + sync_area = _lv_ll_get_head(&disp_refr->sync_areas); + while(sync_area != NULL) { + /*Get next sync area*/ + next_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area); + + /*Remove intersect of redraw area from sync area and get remaining areas*/ + res_c = _lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); + + /*New sub areas created after removing intersect*/ + if(res_c != -1) { + /*Replace old sync area with new areas*/ + for(j = 0; j < res_c; j++) { + new_area = _lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); + *new_area = res[j]; + } + _lv_ll_remove(&disp_refr->sync_areas, sync_area); + lv_mem_free(sync_area); + } + + /*Move on to next sync area*/ + sync_area = next_area; + } + } + + /*Copy sync areas (if any remaining)*/ + for(sync_area = _lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; + sync_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { + disp_refr->driver->draw_ctx->buffer_copy( + disp_refr->driver->draw_ctx, + buf_off_screen, stride, sync_area, + buf_on_screen, stride, sync_area + ); + } + + /*Clear sync areas*/ + _lv_ll_clear(&disp_refr->sync_areas); +} + /** * Refresh the joined areas */ @@ -620,9 +699,15 @@ static void refr_area_part(lv_draw_ctx_t * draw_ctx) { lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); + if(draw_ctx->init_buf) + draw_ctx->init_buf(draw_ctx); + /* Below the `area_p` area will be redrawn into the draw buffer. - * In single buffered mode wait here until the buffer is freed.*/ - if(draw_buf->buf1 && !draw_buf->buf2) { + * In single buffered mode wait here until the buffer is freed. + * In full double buffered mode wait here while the buffers are swapped and a buffer becomes available*/ + bool full_sized = draw_buf->size == (uint32_t)disp_refr->driver->hor_res * disp_refr->driver->ver_res; + if((draw_buf->buf1 && !draw_buf->buf2) || + (draw_buf->buf1 && draw_buf->buf2 && full_sized)) { while(draw_buf->flushing) { if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver); } @@ -710,11 +795,7 @@ static void refr_area_part(lv_draw_ctx_t * draw_ctx) refr_obj_and_children(draw_ctx, lv_disp_get_layer_top(disp_refr)); refr_obj_and_children(draw_ctx, lv_disp_get_layer_sys(disp_refr)); - /*In true double buffered mode flush only once when all areas were rendered. - *In normal mode flush after every area*/ - if(disp_refr->driver->full_refresh == false) { - draw_buf_flush(disp_refr); - } + draw_buf_flush(disp_refr); } /** @@ -893,7 +974,7 @@ void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) lv_obj_redraw(draw_ctx, obj); } else { - lv_opa_t opa = lv_obj_get_style_opa(obj, 0); + lv_opa_t opa = lv_obj_get_style_opa_layered(obj, 0); if(opa < LV_OPA_MIN) return; lv_area_t layer_area_full; @@ -922,6 +1003,13 @@ void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) .y = lv_obj_get_style_transform_pivot_y(obj, 0) }; + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + lv_draw_img_dsc_t draw_dsc; lv_draw_img_dsc_init(&draw_dsc); draw_dsc.opa = opa; @@ -1025,7 +1113,7 @@ static void draw_buf_rotate_180(lv_disp_drv_t * drv, lv_area_t * area, lv_color_ area->x1 = drv->hor_res - tmp_coord - 1; } -static LV_ATTRIBUTE_FAST_MEM void draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h, +static void LV_ATTRIBUTE_FAST_MEM draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h, lv_color_t * orig_color_p, lv_color_t * rot_buf) { @@ -1189,24 +1277,13 @@ static void draw_buf_flush(lv_disp_t * disp) lv_draw_ctx_t * draw_ctx = disp->driver->draw_ctx; if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx); - /* In double buffered mode wait until the other buffer is freed + /* In partial double buffered mode wait until the other buffer is freed * and driver is ready to receive the new buffer */ - if(draw_buf->buf1 && draw_buf->buf2) { + bool full_sized = draw_buf->size == (uint32_t)disp_refr->driver->hor_res * disp_refr->driver->ver_res; + if(draw_buf->buf1 && draw_buf->buf2 && !full_sized) { while(draw_buf->flushing) { if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver); } - - /*If the screen is transparent initialize it when the flushing is ready*/ -#if LV_COLOR_SCREEN_TRANSP - if(disp_refr->driver->screen_transp) { - if(disp_refr->driver->clear_cb) { - disp_refr->driver->clear_cb(disp_refr->driver, disp_refr->driver->draw_buf->buf_act, disp_refr->driver->draw_buf->size); - } - else { - lv_memset_00(disp_refr->driver->draw_buf->buf_act, disp_refr->driver->draw_buf->size * LV_IMG_PX_SIZE_ALPHA_BYTE); - } - } -#endif } draw_buf->flushing = 1; @@ -1225,6 +1302,7 @@ static void draw_buf_flush(lv_disp_t * disp) call_flush_cb(disp->driver, draw_ctx->buf_area, draw_ctx->buf); } } + /*If there are 2 buffers swap them. With direct mode swap only on the last area*/ if(draw_buf->buf1 && draw_buf->buf2 && (!disp->driver->direct_mode || flushing_last)) { if(draw_buf->buf_act == draw_buf->buf1) diff --git a/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c b/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c index 7777fe2..cc1ef60 100644 --- a/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c +++ b/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c @@ -3,6 +3,24 @@ * */ +/* + * Copyright (C) 2010-2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /********************* * INCLUDES *********************/ @@ -39,6 +57,7 @@ #include "../../core/lv_refr.h" #if LV_USE_GPU_ARM2D +#define __ARM_2D_IMPL__ #include "arm_2d.h" #include "__arm_2d_impl.h" @@ -89,10 +108,14 @@ #define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb16_cl_key_copy #define __arm_2d_impl_alpha_blending_colour_keying \ __arm_2d_impl_rgb565_alpha_blending_colour_keying -#define arm_2d_tile_transform_with_src_mask_and_opacity \ - arm_2d_rgb565_tile_transform_with_src_mask_and_opacity -#define arm_2d_tile_transform_with_opacity \ - arm_2d_rgb565_tile_transform_with_opacity +#define arm_2d_tile_transform_with_src_mask_and_opacity_prepare \ + arm_2dp_rgb565_tile_transform_with_src_mask_and_opacity_prepare +#define arm_2d_tile_transform_with_opacity_prepare \ + arm_2dp_rgb565_tile_transform_with_opacity_prepare +#define arm_2d_tile_transform_only_with_opacity_prepare \ + arm_2dp_rgb565_tile_transform_only_with_opacity_prepare +#define arm_2d_tile_transform_prepare \ + arm_2dp_rgb565_tile_transform_prepare #define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_RGB565 @@ -124,10 +147,14 @@ #define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb32_cl_key_copy #define __arm_2d_impl_alpha_blending_colour_keying \ __arm_2d_impl_cccn888_alpha_blending_colour_keying -#define arm_2d_tile_transform_with_src_mask_and_opacity \ - arm_2d_cccn888_tile_transform_with_src_mask_and_opacity -#define arm_2d_tile_transform_with_opacity \ - arm_2d_cccn888_tile_transform_with_opacity +#define arm_2d_tile_transform_with_src_mask_and_opacity_prepare \ + arm_2dp_cccn888_tile_transform_with_src_mask_and_opacity_prepare +#define arm_2d_tile_transform_with_opacity_prepare \ + arm_2dp_cccn888_tile_transform_with_opacity_prepare +#define arm_2d_tile_transform_only_with_opacity_prepare \ + arm_2dp_cccn888_tile_transform_only_with_opacity_prepare +#define arm_2d_tile_transform_prepare \ + arm_2dp_cccn888_tile_transform_prepare #define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_CCCN888 @@ -298,11 +325,88 @@ /* replace src_buf for the following operation */ \ src_buf = (const uint8_t *)rgb_tmp_buf; \ } \ - __VA_ARGS__ \ + do { \ + __VA_ARGS__ \ + } while(0); \ if (NULL != rgb_tmp_buf) { \ lv_mem_buf_release(rgb_tmp_buf); \ } \ - } while(0); + } while(0); \ + src_buf = src_buf_org; + +#define __RECOLOUR_BEGIN() \ + do { \ + lv_color_t *rgb_tmp_buf = NULL; \ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ + rgb_tmp_buf \ + = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolour, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy(rgb_tmp_buf, src_buf, src_w * src_h * sizeof(lv_color_t));\ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-colour */ \ + __arm_2d_impl_colour_filling_with_opacity( \ + (color_int *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + (color_int)draw_dsc->recolor.full, \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + do { + +#define __RECOLOUR_END() \ + } while(0); \ + if (NULL != rgb_tmp_buf) { \ + lv_mem_buf_release(rgb_tmp_buf); \ + } \ + } while(0); \ + src_buf = src_buf_org; + +#define __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(__TRANS_PREPARE, ...) \ + do { \ + __TRANS_PREPARE( \ + NULL, \ + __VA_ARGS__); \ + \ + target_region = (arm_2d_region_t) { \ + .tLocation = { \ + .iX = coords->x1 - draw_ctx->clip_area->x1, \ + .iY = coords->y1 - draw_ctx->clip_area->y1, \ + }, \ + .tSize = { \ + .iWidth = lv_area_get_width(coords), \ + .iHeight = lv_area_get_height(coords), \ + }, \ + }; \ + \ + arm_2d_size_t tTransSize \ + = ARM_2D_CTRL.DefaultOP \ + .tTransform.Source.ptTile->tRegion.tSize; \ + \ + if (target_region.tSize.iWidth < tTransSize.iWidth) { \ + int16_t iDelta = tTransSize.iWidth - target_region.tSize.iWidth;\ + target_region.tLocation.iX -= iDelta / 2; \ + target_region.tSize.iWidth = tTransSize.iWidth; \ + } \ + \ + if (target_region.tSize.iHeight < tTransSize.iHeight) { \ + int16_t iDelta \ + = tTransSize.iHeight - target_region.tSize.iHeight; \ + target_region.tLocation.iY -= iDelta / 2; \ + target_region.tSize.iHeight = tTransSize.iHeight; \ + } \ + } while(0) + /* *INDENT-ON* */ /********************** @@ -314,19 +418,17 @@ **********************/ #if __ARM_2D_HAS_HW_ACC__ -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - lv_color_t color, - lv_opa_t opa, - const arm_2d_tile_t * mask_tile); - -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - arm_2d_tile_t * source_tile, - lv_opa_t opa, - arm_2d_tile_t * mask_tile); +static bool /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + lv_color_t color, + lv_opa_t opa, + const arm_2d_tile_t * mask_tile); + +static bool /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + arm_2d_tile_t * source_tile, + lv_opa_t opa, + arm_2d_tile_t * mask_tile); #else static void convert_cb(const lv_area_t * dest_area, @@ -339,36 +441,32 @@ static void convert_cb(const lv_area_t * dest_area, lv_color_t * cbuf, lv_opa_t * abuf); -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_fill_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - lv_color_t color, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride); - -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_copy_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, - lv_coord_t src_stride, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride); +static bool /* LV_ATTRIBUTE_FAST_MEM */ arm_2d_fill_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + lv_color_t color, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride); + +static bool /* LV_ATTRIBUTE_FAST_MEM */ arm_2d_copy_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, + lv_coord_t src_stride, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride); #endif -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); -LV_ATTRIBUTE_FAST_MEM -static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx); -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, - const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, - const uint8_t * src_buf, - lv_img_cf_t cf); +static void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx); +static void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, + const uint8_t * src_buf, + lv_img_cf_t cf); /********************** * STATIC VARIABLES @@ -408,8 +506,8 @@ void lv_draw_arm2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) extern void test_flush(lv_color_t * color_p); #if __ARM_2D_HAS_HW_ACC__ -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc) { const lv_opa_t * mask; if(dsc->mask_buf == NULL) mask = NULL; @@ -456,12 +554,11 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend } -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - lv_color_t color, - lv_opa_t opa, - const arm_2d_tile_t * mask_tile) +static bool LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + lv_color_t color, + lv_opa_t opa, + const arm_2d_tile_t * mask_tile) { arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE; @@ -519,12 +616,11 @@ static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, } -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - arm_2d_tile_t * source_tile, - lv_opa_t opa, - arm_2d_tile_t * mask_tile) +static bool LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + arm_2d_tile_t * source_tile, + lv_opa_t opa, + arm_2d_tile_t * mask_tile) { arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE; @@ -587,8 +683,8 @@ static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx) #else -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc) { const lv_opa_t * mask; if(dsc->mask_buf == NULL) mask = NULL; @@ -601,18 +697,26 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend lv_area_t blend_area; if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + //lv_disp_t * disp = _lv_refr_get_disp_refreshing(); bool is_accelerated = false; do { - if(NULL != disp->driver->set_px_cb) { - break; - } + /* target buffer */ lv_color_t * dest_buf = draw_ctx->buf; - dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) - + (blend_area.x1 - draw_ctx->buf_area->x1); + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->screen_transp == 0) { + dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); + } + else { + /*With LV_COLOR_DEPTH 16 it means ARGB8565 (3 bytes format)*/ + uint8_t * dest_buf8 = (uint8_t *) dest_buf; + dest_buf8 += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 += (blend_area.x1 - draw_ctx->buf_area->x1) * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf = (lv_color_t *)dest_buf8; + } + /* source buffer */ const lv_color_t * src_buf = dsc->src_buf; lv_coord_t src_stride; if(src_buf) { @@ -634,7 +738,9 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - + if(disp->driver->screen_transp) { + break; + } if(dsc->src_buf == NULL) { if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { is_accelerated = arm_2d_fill_normal(dest_buf, @@ -645,14 +751,8 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend mask, mask_stride); } -#if LV_DRAW_COMPLEX - else { - break; - } -#endif } else { - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { is_accelerated = arm_2d_copy_normal(dest_buf, &blend_area, @@ -663,25 +763,19 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend mask, mask_stride); } -#if LV_DRAW_COMPLEX - else { - break; - } -#endif } } while(0); if(!is_accelerated) lv_draw_sw_blend_basic(draw_ctx, dsc); } -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_fill_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - lv_color_t color, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride) +static bool LV_ATTRIBUTE_FAST_MEM arm_2d_fill_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + lv_color_t color, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride) { arm_2d_size_t target_size = { .iWidth = lv_area_get_width(dest_area), @@ -698,15 +792,11 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, } /*Has opacity*/ else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_colour_filling_with_opacity((color_int *)dest_buf, dest_stride, &target_size, color.full, opa); -#endif } } /*Masked*/ @@ -722,9 +812,6 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, } /*With opacity*/ else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_colour_filling_mask_opacity((color_int *)dest_buf, dest_stride, (uint8_t *)mask, @@ -732,7 +819,6 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, &target_size, color.full, opa); -#endif } } @@ -740,15 +826,14 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, } -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_copy_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, - lv_coord_t src_stride, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride) +static bool LV_ATTRIBUTE_FAST_MEM arm_2d_copy_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, + lv_coord_t src_stride, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride) { int32_t w = lv_area_get_width(dest_area); @@ -759,10 +844,6 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, .iHeight = lv_area_get_height(dest_area), }; -#if LV_COLOR_SCREEN_TRANSP - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); -#endif - /*Simple fill (maybe with opacity), no masking*/ if(mask == NULL) { if(opa >= LV_OPA_MAX) { @@ -773,25 +854,18 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, ©_size); } else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_alpha_blending((color_int *)src_buf, src_stride, (color_int *)dest_buf, dest_stride, ©_size, opa); -#endif } } /*Masked*/ else { /*Only the mask matters*/ if(opa > LV_OPA_MAX) { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_src_msk_copy((color_int *)src_buf, src_stride, (uint8_t *)mask, @@ -800,13 +874,9 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, (color_int *)dest_buf, dest_stride, ©_size); -#endif } /*Handle opa and mask values too*/ else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_gray8_alpha_blending((uint8_t *)mask, mask_stride, (uint8_t *)mask, @@ -822,23 +892,22 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, (color_int *)dest_buf, dest_stride, ©_size); -#endif } } return true; } -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, - const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, - const uint8_t * src_buf, - lv_img_cf_t cf) +static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, + const uint8_t * src_buf, + lv_img_cf_t cf) { /*Use the clip area as draw area*/ lv_area_t draw_area; lv_area_copy(&draw_area, draw_ctx->clip_area); + const uint8_t * src_buf_org = src_buf; bool mask_any = lv_draw_mask_is_any(&draw_area); bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false; @@ -851,6 +920,13 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, blend_dsc.blend_mode = draw_dsc->blend_mode; blend_dsc.blend_area = &blend_area; + if(lv_img_cf_is_chroma_keyed(cf)) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; + else if(cf == LV_IMG_CF_ALPHA_8BIT) {} + else if(cf == LV_IMG_CF_RGB565A8) {} + else if(lv_img_cf_has_alpha(cf)) cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + else cf = LV_IMG_CF_TRUE_COLOR; + + /*The simplest case just copy the pixels into the draw_buf*/ if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) { blend_dsc.src_buf = (const lv_color_t *)src_buf; @@ -859,6 +935,9 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, lv_draw_sw_blend(draw_ctx, &blend_dsc); } else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) { + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, coords, draw_ctx->clip_area)) return; + blend_dsc.mask_buf = (lv_opa_t *)src_buf; blend_dsc.mask_area = coords; blend_dsc.src_buf = NULL; @@ -869,7 +948,8 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, lv_draw_sw_blend(draw_ctx, &blend_dsc); } #if LV_COLOR_DEPTH == 16 - else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) { + else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP && + blend_dsc.opa >= LV_OPA_MAX) { lv_coord_t src_w = lv_area_get_width(coords); lv_coord_t src_h = lv_area_get_height(coords); blend_dsc.src_buf = (const lv_color_t *)src_buf; @@ -922,6 +1002,23 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; blend_dsc.mask_res = mask_res_def; + if(cf == LV_IMG_CF_ALPHA_8BIT) { + /* original code: + lv_color_fill(rgb_buf, draw_dsc->recolor, buf_size); + */ + arm_2d_size_t copy_size = { + .iWidth = buf_w, + .iHeight = buf_h, + }; + + /* apply re-colour */ + __arm_2d_impl_colour_filling( + (color_int *)rgb_buf, + buf_w, + ©_size, + (color_int)draw_dsc->recolor.full); + } + bool is_accelerated = false; if(!transform) { @@ -968,7 +1065,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, } else if((LV_COLOR_DEPTH == 32) && !mask_any - && (cf == LV_IMG_CF_TRUE_COLOR_ALPHA)) { + && (LV_IMG_CF_TRUE_COLOR_ALPHA == cf)) { /* accelerate copy-with-source-masks-and-opacity */ /* *INDENT-OFF* */ @@ -1025,6 +1122,63 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, ) /* *INDENT-ON* */ } + else if(!mask_any + && (LV_IMG_CF_RGB565A8 == cf)) { + /* accelerate copy-with-source-masks-and-opacity */ + + uint8_t * mask_after_rgb = src_buf + sizeof(lv_color_t) * src_w * src_h; + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + __PREPARE_LL_ACCELERATION__(); + + uint8_t * mask_temp_buf = NULL; + if(blend_dsc.opa < LV_OPA_MAX) { + mask_temp_buf = lv_mem_buf_get(copy_size.iHeight * copy_size.iWidth); + if(NULL == mask_temp_buf) { + LV_LOG_WARN( + "Failed to allocate memory for alpha mask," + " use normal route instead."); + break; + } + lv_memset_00(mask_temp_buf, copy_size.iHeight * copy_size.iWidth); + + __arm_2d_impl_gray8_colour_filling_mask_opacity( + mask_temp_buf, + src_stride, + mask_after_rgb, + src_stride, + ©_size, + 0xFF, + blend_dsc.opa); + + __arm_2d_impl_src_msk_copy( + (color_int *)src_buf_tmp, + src_stride, + mask_temp_buf, + src_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); + + lv_mem_buf_release(mask_temp_buf); + } + else { + __arm_2d_impl_src_msk_copy( + (color_int *)src_buf_tmp, + src_stride, + mask_after_rgb, + src_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); + } + + is_accelerated = true; + ) + /* *INDENT-ON* */ + } else if(!mask_any && (cf == LV_IMG_CF_TRUE_COLOR)) { /* accelerate copy-with-source-masks-and-opacity */ @@ -1063,6 +1217,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, && (draw_dsc->recolor_opa == LV_OPA_TRANSP) && (((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) || (LV_IMG_CF_TRUE_COLOR == cf)) + || (LV_IMG_CF_RGB565A8 == cf) #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ || ((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && (LV_COLOR_DEPTH == 32)) @@ -1070,6 +1225,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, ) ) { + uint8_t * mask_after_rgb = src_buf + sizeof(lv_color_t) * src_w * src_h; /* *INDENT-OFF* */ __RECOLOUR_WRAPPER( /* accelerate transform without re-color */ @@ -1108,17 +1264,6 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, &target_tile, false); - target_region = (arm_2d_region_t) { - .tLocation = { - .iX = coords->x1 - draw_ctx->clip_area->x1, - .iY = coords->y1 - draw_ctx->clip_area->y1, - }, - .tSize = { - .iWidth = lv_area_get_width(coords), - .iHeight = lv_area_get_height(coords), - }, - }; - static arm_2d_tile_t source_tile; source_tile = (arm_2d_tile_t) { @@ -1132,45 +1277,98 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, .pchBuffer = (uint8_t *)src_buf, }; - static arm_2d_tile_t mask_tile; - mask_tile = source_tile; - - mask_tile.tInfo.bHasEnforcedColour = true; - mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32; - mask_tile.pchBuffer += 3; - static arm_2d_location_t source_center, target_center; source_center.iX = draw_dsc->pivot.x; source_center.iY = draw_dsc->pivot.y; + if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) { - if((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) || - (LV_IMG_CF_TRUE_COLOR == cf)) { - arm_2d_tile_transform_with_opacity( + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_with_opacity_prepare, &source_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + (color_int)LV_COLOR_CHROMA_KEY.full, + blend_dsc.opa); + + arm_2d_tile_transform( &target_tile, &target_region, + NULL + ); + is_accelerated = true; + } + #if ARM_2D_VERISON >= 10103 + else if (LV_IMG_CF_TRUE_COLOR == cf) { + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_only_with_opacity_prepare, + &source_tile, source_center, ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), draw_dsc->zoom / 256.0f, - (color_int)LV_COLOR_CHROMA_KEY.full, blend_dsc.opa); + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); + is_accelerated = true; + } + #endif + else if (LV_IMG_CF_RGB565A8 == cf) { + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; + mask_tile.pchBuffer = mask_after_rgb; + + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_with_src_mask_and_opacity_prepare, + &source_tile, + &mask_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + blend_dsc.opa + ); + + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); + is_accelerated = true; } #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \ && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ - else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && + else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && (LV_COLOR_DEPTH == 32)) { - arm_2d_tile_transform_with_src_mask_and_opacity( + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32; + mask_tile.pchBuffer += 3; + + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_with_src_mask_and_opacity_prepare, &source_tile, &mask_tile, - &target_tile, - &target_region, source_center, ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), draw_dsc->zoom / 256.0f, - blend_dsc.opa); + blend_dsc.opa + ); + + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); is_accelerated = true; } @@ -1208,7 +1406,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, (color_int)draw_dsc->recolor.full, draw_dsc->recolor_opa); } -#if LV_DRAW_COMPLEX +#if LV_USE_DRAW_MASKS /*Apply the masks if any*/ if(mask_any) { lv_coord_t y; @@ -1275,7 +1473,7 @@ static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coo if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { uint32_t px_cnt = lv_area_get_size(dest_area); - lv_memset_ff(abuf, px_cnt); + lv_memset(abuf, 0xff, px_cnt); src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t); uint32_t dest_w = lv_area_get_width(dest_area); diff --git a/lib/lvgl/src/draw/lv_draw.h b/lib/lvgl/src/draw/lv_draw.h index 80b62e9..ffe1d4e 100644 --- a/lib/lvgl/src/draw/lv_draw.h +++ b/lib/lvgl/src/draw/lv_draw.h @@ -72,6 +72,7 @@ typedef struct _lv_draw_ctx_t { */ const lv_area_t * clip_area; + void (*init_buf)(struct _lv_draw_ctx_t * draw_ctx); void (*draw_rect)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); diff --git a/lib/lvgl/src/draw/lv_draw_img.c b/lib/lvgl/src/draw/lv_draw_img.c index 41dc0f0..5e67f88 100644 --- a/lib/lvgl/src/draw/lv_draw_img.c +++ b/lib/lvgl/src/draw/lv_draw_img.c @@ -25,8 +25,9 @@ /********************** * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, const void * src); +static lv_res_t /* LV_ATTRIBUTE_FAST_MEM */ decode_and_draw(lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src); static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg); static void draw_cleanup(_lv_img_cache_entry_t * cache); @@ -69,18 +70,19 @@ void lv_draw_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const if(dsc->opa <= LV_OPA_MIN) return; - lv_res_t res; + lv_res_t res = LV_RES_INV; + if(draw_ctx->draw_img) { res = draw_ctx->draw_img(draw_ctx, dsc, coords, src); } - else { + + if(res != LV_RES_OK) { res = decode_and_draw(draw_ctx, dsc, coords, src); } - if(res == LV_RES_INV) { + if(res != LV_RES_OK) { LV_LOG_WARN("Image draw error"); show_error(draw_ctx, coords, "No\ndata"); - return; } } @@ -197,11 +199,19 @@ lv_img_src_t lv_img_src_get_type(const void * src) if(src == NULL) return img_src_type; const uint8_t * u8_p = src; - /*The first byte shows the type of the image source*/ + /*The first or fourth byte depending on platform endianess shows the type of the image source*/ +#if LV_BIG_ENDIAN_SYSTEM + if(u8_p[3] >= 0x20 && u8_p[3] <= 0x7F) { +#else if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { +#endif img_src_type = LV_IMG_SRC_FILE; /*If it's an ASCII character then it's file name*/ } +#if LV_BIG_ENDIAN_SYSTEM + else if(u8_p[3] >= 0x80) { +#else else if(u8_p[0] >= 0x80) { +#endif img_src_type = LV_IMG_SRC_SYMBOL; /*Symbols begins after 0x7F*/ } else { @@ -227,7 +237,8 @@ void lv_draw_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc * STATIC FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, +static lv_res_t LV_ATTRIBUTE_FAST_MEM decode_and_draw(lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const void * src) { if(draw_dsc->opa <= LV_OPA_MIN) return LV_RES_OK; diff --git a/lib/lvgl/src/draw/lv_draw_label.c b/lib/lvgl/src/draw/lv_draw_label.c index 7f80df4..daf4474 100644 --- a/lib/lvgl/src/draw/lv_draw_label.c +++ b/lib/lvgl/src/draw/lv_draw_label.c @@ -52,7 +52,7 @@ static uint8_t hex_char_to_num(char hex); * GLOBAL FUNCTIONS **********************/ -void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) { lv_memset_00(dsc, sizeof(lv_draw_label_dsc_t)); dsc->opa = LV_OPA_COVER; @@ -74,7 +74,7 @@ void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) * @param hint pointer to a `lv_draw_label_hint_t` variable. * It is managed by the draw to speed up the drawing of very long texts (thousands of lines). */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, +void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint) { if(dsc->opa <= LV_OPA_MIN) return; diff --git a/lib/lvgl/src/draw/lv_draw_label.h b/lib/lvgl/src/draw/lv_draw_label.h index de72edd..b28436a 100644 --- a/lib/lvgl/src/draw/lv_draw_label.h +++ b/lib/lvgl/src/draw/lv_draw_label.h @@ -68,7 +68,7 @@ struct _lv_draw_ctx_t; * GLOBAL PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); /** * Write a text @@ -79,8 +79,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); * @param hint pointer to a `lv_draw_label_hint_t` variable. * It is managed by the draw to speed up the drawing of very long texts (thousands of lines). */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint); void lv_draw_letter(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter); diff --git a/lib/lvgl/src/draw/lv_draw_line.c b/lib/lvgl/src/draw/lv_draw_line.c index b4844db..d0c4327 100644 --- a/lib/lvgl/src/draw/lv_draw_line.c +++ b/lib/lvgl/src/draw/lv_draw_line.c @@ -34,7 +34,7 @@ * GLOBAL FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) { lv_memset_00(dsc, sizeof(lv_draw_line_dsc_t)); dsc->width = 1; @@ -42,7 +42,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) dsc->color = lv_color_black(); } -LV_ATTRIBUTE_FAST_MEM void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +void LV_ATTRIBUTE_FAST_MEM lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { if(dsc->width == 0) return; diff --git a/lib/lvgl/src/draw/lv_draw_line.h b/lib/lvgl/src/draw/lv_draw_line.h index d82ea51..b476ce4 100644 --- a/lib/lvgl/src/draw/lv_draw_line.h +++ b/lib/lvgl/src/draw/lv_draw_line.h @@ -43,7 +43,7 @@ struct _lv_draw_ctx_t; * GLOBAL PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); /** * Draw a line @@ -52,8 +52,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); * @param clip the line will be drawn only in this area * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable */ -void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, - const lv_point_t * point2); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); /********************** diff --git a/lib/lvgl/src/draw/lv_draw_mask.c b/lib/lvgl/src/draw/lv_draw_mask.c index 2170da9..872ca9a 100644 --- a/lib/lvgl/src/draw/lv_draw_mask.c +++ b/lib/lvgl/src/draw/lv_draw_mask.c @@ -26,31 +26,31 @@ /********************** * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_line_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_radius_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_angle_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_fade_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_map_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_radius_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_angle_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_fade_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_map_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_polygon_param_t * param); + +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_polygon_param_t * param); - -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, - lv_draw_mask_line_param_t * p); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, - lv_draw_mask_line_param_t * p); + lv_draw_mask_line_param_t * p); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * p); static void circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius); static bool circ_cont(lv_point_t * c); @@ -58,7 +58,7 @@ static void circ_next(lv_point_t * c, lv_coord_t * tmp); static void circ_calc_aa4(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t radius); static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t y, lv_coord_t * len, lv_coord_t * x_start); -LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); +static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); /********************** * STATIC VARIABLES @@ -108,8 +108,8 @@ int16_t lv_draw_mask_add(void * param, void * custom_id) * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len) +lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len) { bool changed = false; _lv_draw_mask_common_dsc_t * dsc; @@ -142,8 +142,9 @@ LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, const int16_t * ids, int16_t ids_count) +lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + const int16_t * ids, int16_t ids_count) { bool changed = false; _lv_draw_mask_common_dsc_t * dsc; @@ -243,7 +244,7 @@ void _lv_draw_mask_cleanup(void) * Count the currently added masks * @return number of active masks */ -LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void) +uint8_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_get_cnt(void) { uint8_t cnt = 0; uint8_t i; @@ -593,7 +594,7 @@ void lv_draw_mask_polygon_init(lv_draw_mask_polygon_param_t * param, const lv_po * STATIC FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) { @@ -653,7 +654,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mas return res; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) { @@ -769,7 +770,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_b return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) { @@ -911,7 +912,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_ return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_angle_param_t * p) { @@ -1050,7 +1051,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * ma -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_radius_param_t * p) { @@ -1167,7 +1168,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * m return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_fade_param_t * p) { @@ -1213,7 +1214,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mas } } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_map_param_t * p) { @@ -1247,7 +1248,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_polygon_param_t * param) { @@ -1518,7 +1519,7 @@ static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_ } -LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) +static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) { if(mask_new >= LV_OPA_MAX) return mask_act; if(mask_new <= LV_OPA_MIN) return 0; diff --git a/lib/lvgl/src/draw/lv_draw_mask.h b/lib/lvgl/src/draw/lv_draw_mask.h index b7e4e1c..908be6b 100644 --- a/lib/lvgl/src/draw/lv_draw_mask.h +++ b/lib/lvgl/src/draw/lv_draw_mask.h @@ -241,8 +241,8 @@ int16_t lv_draw_mask_add(void * param, void * custom_id); * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len); +lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len); /** * Apply the specified buffers on a line. Used internally by the library's drawing routines. @@ -257,8 +257,9 @@ LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, const int16_t * ids, int16_t ids_count); +lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + const int16_t * ids, int16_t ids_count); //! @endcond @@ -299,7 +300,7 @@ void _lv_draw_mask_cleanup(void); * Count the currently added masks * @return number of active masks */ -LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void); +uint8_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_get_cnt(void); /** diff --git a/lib/lvgl/src/draw/lv_draw_rect.c b/lib/lvgl/src/draw/lv_draw_rect.c index f34854d..ae81f38 100644 --- a/lib/lvgl/src/draw/lv_draw_rect.c +++ b/lib/lvgl/src/draw/lv_draw_rect.c @@ -34,7 +34,7 @@ * GLOBAL FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) { lv_memset_00(dsc, sizeof(lv_draw_rect_dsc_t)); dsc->bg_color = lv_color_white(); diff --git a/lib/lvgl/src/draw/lv_draw_rect.h b/lib/lvgl/src/draw/lv_draw_rect.h index 1583e3e..46a58a4 100644 --- a/lib/lvgl/src/draw/lv_draw_rect.h +++ b/lib/lvgl/src/draw/lv_draw_rect.h @@ -74,7 +74,7 @@ struct _lv_draw_ctx_t; * GLOBAL PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); /** diff --git a/lib/lvgl/src/draw/lv_img_buf.c b/lib/lvgl/src/draw/lv_img_buf.c index 4c939dd..5ac1ead 100644 --- a/lib/lvgl/src/draw/lv_img_buf.c +++ b/lib/lvgl/src/draw/lv_img_buf.c @@ -38,17 +38,7 @@ * GLOBAL FUNCTIONS **********************/ -/** - * Get the color of an image's pixel - * @param dsc an image descriptor - * @param x x coordinate of the point to get - * @param y x coordinate of the point to get - * @param color the color of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` this color is used. - * Not used in other cases. - * @param safe true: check out of bounds - * @return color of the point - */ -lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color) +lv_color_t lv_img_buf_get_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color) { lv_color_t p_color = lv_color_black(); uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -107,15 +97,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t return p_color; } -/** - * Get the alpha value of an image's pixel - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param safe true: check out of bounds - * @return alpha value of the point - */ -lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) +lv_opa_t lv_img_buf_get_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) { uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -170,15 +152,7 @@ lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) return LV_OPA_COVER; } -/** - * Set the alpha value of a pixel of an image. The color won't be affected - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param opa the desired opacity - * @param safe true: check out of bounds - */ -void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) +void lv_img_buf_set_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) { uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -229,15 +203,7 @@ void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ } } -/** - * Set the color of a pixel of an image. The alpha channel won't be affected. - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param c color of the point - * @param safe true: check out of bounds - */ -void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) +void lv_img_buf_set_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) { uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -296,17 +262,7 @@ void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ } } -/** - * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` - * @param dsc pointer to an image descriptor - * @param id the palette color to set: - * - for `LV_IMG_CF_INDEXED1`: 0..1 - * - for `LV_IMG_CF_INDEXED2`: 0..3 - * - for `LV_IMG_CF_INDEXED4`: 0..15 - * - for `LV_IMG_CF_INDEXED8`: 0..255 - * @param c the color to set - */ -void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) +void lv_img_buf_set_palette(const lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) { if((dsc->header.cf == LV_IMG_CF_ALPHA_1BIT && id > 1) || (dsc->header.cf == LV_IMG_CF_ALPHA_2BIT && id > 3) || (dsc->header.cf == LV_IMG_CF_ALPHA_4BIT && id > 15) || (dsc->header.cf == LV_IMG_CF_ALPHA_8BIT)) { @@ -320,13 +276,6 @@ void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) lv_memcpy_small(&buf[id * sizeof(c32)], &c32, sizeof(c32)); } -/** - * Allocate an image buffer in RAM - * @param w width of image - * @param h height of image - * @param cf a color format (`LV_IMG_CF_...`) - * @return an allocated image, or NULL on failure - */ lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) { /*Allocate image descriptor*/ @@ -359,10 +308,6 @@ lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) return dsc; } -/** - * Free an allocated image buffer - * @param dsc image buffer to free - */ void lv_img_buf_free(lv_img_dsc_t * dsc) { if(dsc != NULL) { @@ -373,13 +318,6 @@ void lv_img_buf_free(lv_img_dsc_t * dsc) } } -/** - * Get the memory consumption of a raw bitmap, given color format and dimensions. - * @param w width - * @param h height - * @param cf color format - * @return size in bytes - */ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) { switch(cf) { @@ -411,15 +349,6 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) } } -/** - * Get the area of a rectangle if its rotated and scaled - * @param res store the coordinates here - * @param w width of the rectangle to transform - * @param h height of the rectangle to transform - * @param angle angle of rotation - * @param zoom zoom, (256 no zoom) - * @param pivot x,y pivot coordinates of rotation - */ void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, int16_t angle, uint16_t zoom, const lv_point_t * pivot) { diff --git a/lib/lvgl/src/draw/lv_img_buf.h b/lib/lvgl/src/draw/lv_img_buf.h index 1be7bb6..71c3bd0 100644 --- a/lib/lvgl/src/draw/lv_img_buf.h +++ b/lib/lvgl/src/draw/lv_img_buf.h @@ -167,7 +167,7 @@ lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); * @param safe true: check out of bounds * @return color of the point */ -lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color); +lv_color_t lv_img_buf_get_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color); /** * Get the alpha value of an image's pixel @@ -177,7 +177,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t * @param safe true: check out of bounds * @return alpha value of the point */ -lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); +lv_opa_t lv_img_buf_get_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); /** * Set the color of a pixel of an image. The alpha channel won't be affected. @@ -187,7 +187,7 @@ lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) * @param c color of the point * @param safe true: check out of bounds */ -void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); +void lv_img_buf_set_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); /** * Set the alpha value of a pixel of an image. The color won't be affected @@ -197,7 +197,7 @@ void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ * @param opa the desired opacity * @param safe true: check out of bounds */ -void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); +void lv_img_buf_set_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); /** * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` @@ -209,7 +209,7 @@ void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ * - for `LV_IMG_CF_INDEXED8`: 0..255 * @param c the color to set */ -void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); +void lv_img_buf_set_palette(const lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); /** * Free an allocated image buffer diff --git a/lib/lvgl/src/draw/lv_img_decoder.c b/lib/lvgl/src/draw/lv_img_decoder.c index 13050b8..76aff5e 100644 --- a/lib/lvgl/src/draw/lv_img_decoder.c +++ b/lib/lvgl/src/draw/lv_img_decoder.c @@ -360,10 +360,35 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder } lv_img_cf_t cf = dsc->header.cf; + /*Process A8, RGB565A8, need load file to ram after https://github.com/lvgl/lvgl/pull/3337*/ + if(cf == LV_IMG_CF_ALPHA_8BIT || cf == LV_IMG_CF_RGB565A8) { + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + dsc->img_data = ((lv_img_dsc_t *)dsc->src)->data; + return LV_RES_OK; + } + else { + /*If it's a file, read all to memory*/ + uint32_t len = dsc->header.w * dsc->header.h; + len *= cf == LV_IMG_CF_RGB565A8 ? 3 : 1; + uint8_t * fs_buf = lv_mem_alloc(len); + if(fs_buf == NULL) return LV_RES_INV; + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + lv_fs_seek(&user_data->f, 4, LV_FS_SEEK_SET); /*+4 to skip the header*/ + lv_fs_res_t res = lv_fs_read(&user_data->f, fs_buf, len, NULL); + if(res != LV_FS_RES_OK) { + lv_mem_free(fs_buf); + return LV_RES_INV; + } + dsc->img_data = fs_buf; + return LV_RES_OK; + } + } /*Process true color formats*/ - if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || - cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || cf == LV_IMG_CF_RGB565A8 || - cf == LV_IMG_CF_ALPHA_8BIT) { + else if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || + cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { if(dsc->src_type == LV_IMG_SRC_VARIABLE) { /*In case of uncompressed formats the image stored in the ROM/RAM. *So simply give its pointer*/ diff --git a/lib/lvgl/src/draw/lv_img_decoder.h b/lib/lvgl/src/draw/lv_img_decoder.h index f00f95d..9dc84dd 100644 --- a/lib/lvgl/src/draw/lv_img_decoder.h +++ b/lib/lvgl/src/draw/lv_img_decoder.h @@ -144,7 +144,7 @@ void _lv_img_decoder_init(void); * Get information about an image. * Try the created image decoder one by one. Once one is able to get info that info will be used. * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`) + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`) * 2) Variable: Pointer to an `lv_img_dsc_t` variable * 3) Symbol: E.g. `LV_SYMBOL_OK` * @param header the image info will be stored here @@ -157,7 +157,7 @@ lv_res_t lv_img_decoder_get_info(const void * src, lv_img_header_t * header); * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc` * @param dsc describes a decoding session. Simply a pointer to an `lv_img_decoder_dsc_t` variable. * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`) + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`) * 2) Variable: Pointer to an `lv_img_dsc_t` variable * 3) Symbol: E.g. `LV_SYMBOL_OK` * @param color The color of the image with `LV_IMG_CF_ALPHA_...` diff --git a/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk b/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk index 17371ac..18a751e 100644 --- a/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk +++ b/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk @@ -1,5 +1,3 @@ -CSRCS += lv_gpu_nxp.c - DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp diff --git a/lib/lvgl/src/draw/nxp/lv_gpu_nxp.c b/lib/lvgl/src/draw/nxp/lv_gpu_nxp.c deleted file mode 100644 index 46da933..0000000 --- a/lib/lvgl/src/draw/nxp/lv_gpu_nxp.c +++ /dev/null @@ -1,418 +0,0 @@ -/** - * @file lv_gpu_nxp.c - * - */ - -/** - * MIT License - * - * Copyright 2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_gpu_nxp.h" - -#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE - -/* - * allow to use both PXP and VGLITE - - * both 2D accelerators can be used at the same time: - * thus VGLITE can be used to accelerate widget drawing - * while PXP accelerates Blit & Fill operations. - */ -#if LV_USE_GPU_NXP_PXP - #include "pxp/lv_draw_pxp_blend.h" -#endif -#if LV_USE_GPU_NXP_VG_LITE - #include "vglite/lv_draw_vglite_blend.h" - #include "vglite/lv_draw_vglite_rect.h" - #include "vglite/lv_draw_vglite_arc.h" -#endif - -#if LV_COLOR_DEPTH != 32 - #include "../../core/lv_refr.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); - -static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); - -static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); - -static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); - -static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - uint16_t radius, uint16_t start_angle, uint16_t end_angle); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_nxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) -{ - lv_draw_sw_init_ctx(drv, draw_ctx); - - lv_draw_nxp_ctx_t * nxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; - - nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc; - nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect; - nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded; - nxp_draw_ctx->blend = lv_draw_nxp_blend; - //nxp_draw_ctx->base_draw.wait_for_finish = lv_draw_nxp_wait_cb; -} - -void lv_draw_nxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) -{ - lv_draw_sw_deinit_ctx(drv, draw_ctx); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * During rendering, LVGL might initializes new draw_ctxs and start drawing into - * a separate buffer (called layer). If the content to be rendered has "holes", - * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. - * It means the renderers should draw into an ARGB buffer. - * With 32 bit color depth it's not a big problem but with 16 bit color depth - * the target pixel format is ARGB8565 which is not supported by the GPU. - * In this case, the NXP callbacks should fallback to SW rendering. - */ -static inline bool need_argb8565_support() -{ -#if LV_COLOR_DEPTH != 32 - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - - if(disp->driver->screen_transp == 1) - return true; -#endif - - return false; -} - -static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) -{ - lv_area_t blend_area; - - /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ - if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) - return; /*Fully clipped, nothing to do*/ - - /*Make the blend area relative to the buffer*/ - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - bool done = false; - - /*Fill/Blend only non masked, normal blended*/ - if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && !need_argb8565_support()) { - lv_color_t * dest_buf = draw_ctx->buf; - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); -#if LV_USE_GPU_NXP_VG_LITE - lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); - lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); -#endif - - const lv_color_t * src_buf = dsc->src_buf; - - if(src_buf == NULL) { -#if LV_USE_GPU_NXP_PXP - done = (lv_gpu_nxp_pxp_fill(dest_buf, dest_stride, &blend_area, - dsc->color, dsc->opa) == LV_RES_OK); - if(!done) - PXP_LOG_TRACE("PXP fill failed. Fallback."); - -#endif -#if LV_USE_GPU_NXP_VG_LITE - if(!done) { - done = (lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &blend_area, - dsc->color, dsc->opa) == LV_RES_OK); - if(!done) - VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback."); - } -#endif - } - else { -#if LV_USE_GPU_NXP_PXP - done = (lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, dsc->blend_area, - dsc->opa, LV_DISP_ROT_NONE) == LV_RES_OK); - if(!done) - PXP_LOG_TRACE("PXP blit failed. Fallback."); -#endif -#if LV_USE_GPU_NXP_VG_LITE - if(!done) { - lv_gpu_nxp_vglite_blit_info_t blit; - lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); - - blit.src = src_buf; - blit.src_width = lv_area_get_width(dsc->blend_area); - blit.src_height = lv_area_get_height(dsc->blend_area); - blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t); - blit.src_area.x1 = (blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1)); - blit.src_area.y1 = (blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1)); - blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1; - blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1; - - blit.dst = dest_buf; - blit.dst_width = dest_width; - blit.dst_height = dest_height; - blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t); - blit.dst_area.x1 = blend_area.x1; - blit.dst_area.y1 = blend_area.y1; - blit.dst_area.x2 = blend_area.x2; - blit.dst_area.y2 = blend_area.y2; - - blit.opa = dsc->opa; - blit.zoom = LV_IMG_ZOOM_NONE; - blit.angle = 0; - - done = (lv_gpu_nxp_vglite_blit(&blit) == LV_RES_OK); - - if(!done) - VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback."); - } -#endif - } - } - - if(!done) - lv_draw_sw_blend_basic(draw_ctx, dsc); -} - -static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) -{ - /*Use the clip area as draw area*/ - lv_area_t draw_area; - lv_area_copy(&draw_area, draw_ctx->clip_area); - bool mask_any = lv_draw_mask_is_any(&draw_area); -#if LV_USE_GPU_NXP_VG_LITE - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); -#endif -#if LV_USE_GPU_NXP_PXP - bool scale = (dsc->zoom != LV_IMG_ZOOM_NONE); -#endif - bool done = false; - - lv_area_t blend_area; - /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ - if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area)) - return; /*Fully clipped, nothing to do*/ - - /*Make the blend area relative to the buffer*/ - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - const lv_color_t * src_buf = (const lv_color_t *)map_p; - if(!src_buf) { - lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); - return; - } - - lv_color_t * dest_buf = draw_ctx->buf; - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); - -#if LV_USE_GPU_NXP_PXP - if(!mask_any && !scale && !need_argb8565_support() -#if LV_COLOR_DEPTH!=32 - && !lv_img_cf_has_alpha(cf) -#endif - ) { - done = (lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, coords, - dsc, cf) == LV_RES_OK); - if(!done) - PXP_LOG_TRACE("PXP blit transform failed. Fallback."); - } -#endif - -#if LV_USE_GPU_NXP_VG_LITE - if(!done && !mask_any && !need_argb8565_support() && - !lv_img_cf_is_chroma_keyed(cf) && !recolor -#if LV_COLOR_DEPTH!=32 - && !lv_img_cf_has_alpha(cf) -#endif - ) { - lv_gpu_nxp_vglite_blit_info_t blit; - lv_coord_t src_stride = lv_area_get_width(coords); - - blit.src = src_buf; - blit.src_width = lv_area_get_width(coords); - blit.src_height = lv_area_get_height(coords); - blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t); - blit.src_area.x1 = (blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1)); - blit.src_area.y1 = (blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1)); - blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1; - blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1; - - blit.dst = dest_buf; - blit.dst_width = lv_area_get_width(draw_ctx->buf_area); - blit.dst_height = lv_area_get_height(draw_ctx->buf_area); - blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t); - blit.dst_area.x1 = blend_area.x1; - blit.dst_area.y1 = blend_area.y1; - blit.dst_area.x2 = blend_area.x2; - blit.dst_area.y2 = blend_area.y2; - - blit.opa = dsc->opa; - blit.angle = dsc->angle; - blit.pivot = dsc->pivot; - blit.zoom = dsc->zoom; - - done = (lv_gpu_nxp_vglite_blit_transform(&blit) == LV_RES_OK); - - if(!done) - VG_LITE_LOG_TRACE("VG-Lite blit transform failed. Fallback."); - } -#endif - - if(!done) - lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); -} - -static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) -{ - bool done = false; - lv_draw_rect_dsc_t nxp_dsc; - - lv_memcpy(&nxp_dsc, dsc, sizeof(nxp_dsc)); -#if LV_DRAW_COMPLEX - /* Draw only the shadow */ - nxp_dsc.bg_opa = 0; - nxp_dsc.bg_img_opa = 0; - nxp_dsc.border_opa = 0; - nxp_dsc.outline_opa = 0; - - lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords); - - /* Draw the background */ - nxp_dsc.shadow_opa = 0; - nxp_dsc.bg_opa = dsc->bg_opa; - done = (draw_nxp_bg(draw_ctx, &nxp_dsc, coords) == LV_RES_OK); -#endif /*LV_DRAW_COMPLEX*/ - - /* Draw the remaining parts */ - nxp_dsc.shadow_opa = 0; - if(done) - nxp_dsc.bg_opa = 0; - nxp_dsc.bg_img_opa = dsc->bg_img_opa; - nxp_dsc.border_opa = dsc->border_opa; - nxp_dsc.outline_opa = dsc->outline_opa; - - lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords); -} - -static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->bg_opa <= LV_OPA_MIN) - return LV_RES_INV; - - lv_area_t bg_coords; - lv_area_copy(&bg_coords, coords); - - /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ - if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) { - bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; - bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; - bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; - bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; - } - - lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_ctx->clip_area)) - return LV_RES_INV; - - lv_grad_dir_t grad_dir = dsc->bg_grad.dir; - lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->bg_color : dsc->bg_grad.stops[0].color; - if(bg_color.full == dsc->bg_grad.stops[1].color.full) grad_dir = LV_GRAD_DIR_NONE; - - bool mask_any = lv_draw_mask_is_any(&bg_coords); - - /* - * Most simple case: just a plain rectangle (no mask, no radius, no gradient) - * shall fallback to lv_draw_sw_blend(). - * - * Complex case: gradient or radius but no mask. - */ - if(!mask_any && ((dsc->radius != 0) || (grad_dir != LV_GRAD_DIR_NONE)) && !need_argb8565_support()) { -#if LV_USE_GPU_NXP_VG_LITE - lv_res_t res = lv_gpu_nxp_vglite_draw_bg(draw_ctx, dsc, &bg_coords); - if(res != LV_RES_OK) - VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback."); - - return res; -#endif - } - - return LV_RES_INV; -} - -static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - uint16_t radius, uint16_t start_angle, uint16_t end_angle) -{ - bool done = false; - -#if LV_DRAW_COMPLEX - if(dsc->opa <= LV_OPA_MIN) - return; - if(dsc->width == 0) - return; - if(start_angle == end_angle) - return; - -#if LV_USE_GPU_NXP_VG_LITE - if(!need_argb8565_support()) { - done = (lv_gpu_nxp_vglite_draw_arc(draw_ctx, dsc, center, (int32_t)radius, - (int32_t)start_angle, (int32_t)end_angle) == LV_RES_OK); - if(!done) - VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); - } -#endif -#endif/*LV_DRAW_COMPLEX*/ - - if(!done) - lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); -} - -#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk b/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk index ff475a1..5c684bc 100644 --- a/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk +++ b/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk @@ -1,3 +1,4 @@ +CSRCS += lv_draw_pxp.c CSRCS += lv_draw_pxp_blend.c CSRCS += lv_gpu_nxp_pxp_osa.c CSRCS += lv_gpu_nxp_pxp.c diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c new file mode 100644 index 0000000..cd70f48 --- /dev/null +++ b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c @@ -0,0 +1,275 @@ +/** + * @file lv_draw_pxp.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_GPU_NXP_PXP +#include "lv_draw_pxp_blend.h" + +#if LV_COLOR_DEPTH != 32 + #include "../../../core/lv_refr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/* Minimum area (in pixels) for PXP blit/fill processing. */ +#ifndef LV_GPU_NXP_PXP_SIZE_LIMIT + #define LV_GPU_NXP_PXP_SIZE_LIMIT 5000 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx); + +static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); + +static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_pxp_ctx_t * pxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded; + pxp_draw_ctx->blend = lv_draw_pxp_blend; + pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish; + pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy; +} + +void lv_draw_pxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_deinit_ctx(drv, draw_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * During rendering, LVGL might initializes new draw_ctxs and start drawing into + * a separate buffer (called layer). If the content to be rendered has "holes", + * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. + * It means the renderers should draw into an ARGB buffer. + * With 32 bit color depth it's not a big problem but with 16 bit color depth + * the target pixel format is ARGB8565 which is not supported by the GPU. + * In this case, the PXP callbacks should fallback to SW rendering. + */ +static inline bool need_argb8565_support() +{ +#if LV_COLOR_DEPTH != 32 + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + if(disp->driver->screen_transp == 1) + return true; +#endif + + return false; +} + +static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx) +{ + lv_gpu_nxp_pxp_wait(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + + lv_area_t blend_area; + /*Let's get the blend area which is the intersection of the area to draw and the clip area*/ + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + if(dsc->mask_buf != NULL || dsc->blend_mode != LV_BLEND_MODE_NORMAL || + lv_area_get_size(&blend_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + + /*Fill/Blend only non masked, normal blended*/ + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + const lv_color_t * src_buf = dsc->src_buf; + + if(src_buf == NULL) { + lv_gpu_nxp_pxp_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa); + } + else { + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + + lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, src_stride, + dsc->opa, LV_DISP_ROT_NONE); + } +} + +static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + const lv_color_t * src_buf = (const lv_color_t *)map_p; + if(!src_buf) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE); + bool has_rotation = (dsc->angle != 0); + bool unsup_rotation = false; + + lv_area_t blend_area; + if(has_rotation) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&blend_area); + lv_coord_t src_width = lv_area_get_width(coords); + lv_coord_t src_height = lv_area_get_height(coords); + + if(has_rotation) { + /* + * PXP can only rotate at 90x angles. + */ + if(dsc->angle % 900) { + PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); + unsup_rotation = true; + } + + /* + * PXP is set to process 16x16 blocks to optimize the system for memory + * bandwidth and image processing time. + * The output engine essentially truncates any output pixels after the + * desired number of pixels has been written. + * When rotating a source image and the output is not divisible by the block + * size, the incorrect pixels could be truncated and the final output image + * can look shifted. + */ + if(src_width % 16 || src_height % 16) { + PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16."); + unsup_rotation = true; + } + } + + if(has_mask || has_scale || unsup_rotation || lv_area_get_size(&blend_area) < LV_GPU_NXP_PXP_SIZE_LIMIT +#if LV_COLOR_DEPTH != 32 + || lv_img_cf_has_alpha(cf) +#endif + ) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + src_width - 1; + src_area.y2 = src_area.y1 + src_height - 1; + lv_coord_t src_stride = lv_area_get_width(coords); + + lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, &src_area, src_stride, + dsc, cf); +} + +static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + LV_UNUSED(draw_ctx); + + if(lv_area_get_size(dest_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) { + lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area); + return; + } + + lv_gpu_nxp_pxp_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride); +} + +#endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/lib/lvgl/src/draw/nxp/lv_gpu_nxp.h b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h similarity index 77% rename from lib/lvgl/src/draw/nxp/lv_gpu_nxp.h rename to lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h index 899aff2..1ace3bc 100644 --- a/lib/lvgl/src/draw/nxp/lv_gpu_nxp.h +++ b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h @@ -1,12 +1,12 @@ /** - * @file lv_gpu_nxp.h + * @file lv_draw_pxp.h * */ /** * MIT License * - * Copyright 2022 NXP + * Copyright 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,8 +27,8 @@ * */ -#ifndef LV_GPU_NXP_H -#define LV_GPU_NXP_H +#ifndef LV_DRAW_PXP_H +#define LV_DRAW_PXP_H #ifdef __cplusplus extern "C" { @@ -38,9 +38,10 @@ extern "C" { * INCLUDES *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE -#include "../sw/lv_draw_sw.h" +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_PXP +#include "../../sw/lv_draw_sw.h" /********************* * DEFINES @@ -49,23 +50,23 @@ extern "C" { /********************** * TYPEDEFS **********************/ -typedef lv_draw_sw_ctx_t lv_draw_nxp_ctx_t; +typedef lv_draw_sw_ctx_t lv_draw_pxp_ctx_t; /********************** * GLOBAL PROTOTYPES **********************/ -void lv_draw_nxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void lv_draw_pxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); -void lv_draw_nxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void lv_draw_pxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); /********************** * MACROS **********************/ -#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/ +#endif /*LV_USE_GPU_NXP_PXP*/ #ifdef __cplusplus } /*extern "C"*/ #endif -#endif /*LV_GPU_NXP_H*/ +#endif /*LV_DRAW_PXP_H*/ diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c index c0a6eca..8292576 100644 --- a/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c +++ b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,6 +34,7 @@ #include "lv_draw_pxp_blend.h" #if LV_USE_GPU_NXP_PXP +#include "lvgl_support.h" /********************* * DEFINES @@ -43,25 +44,25 @@ #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature. #endif -#if LV_COLOR_DEPTH==16 +#if LV_COLOR_DEPTH == 16 #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565 #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565 #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565 -#elif LV_COLOR_DEPTH==32 + #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 2U +#elif LV_COLOR_DEPTH == 32 #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatARGB8888 #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatARGB8888 - #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 + #if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatARGB8888 + #else + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 + #endif + #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 4U #elif #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. #endif -#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ - || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) - #define ALIGN_SIZE 8 -#else - #define ALIGN_SIZE 4 -#endif - /********************** * TYPEDEFS **********************/ @@ -70,63 +71,60 @@ * STATIC PROTOTYPES **********************/ +static LV_ATTRIBUTE_MEM_ALIGN uint8_t temp_buf[PXP_TEMP_BUF_SIZE]; + /** * BLock Image Transfer - copy rectangular image from src buffer to dst buffer * with combination of transformation (rotation, scale, recolor) and opacity, alpha channel * or color keying. This requires two steps. First step is used for transformation into * a temporary buffer and the second one will handle the color format or opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area area to be copied from src_buf to dst_buf - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format */ -static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); /** * BLock Image Transfer - copy rectangular image from src buffer to dst buffer * with transformation and full opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area area to be copied from src_buf to dst_buf - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format */ -static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); /** * BLock Image Transfer - copy rectangular image from src buffer to dst buffer * without transformation but handling color format or opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area area to be copied from src_buf to dst_buf - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format */ -static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +static void lv_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); /********************** * STATIC VARIABLES @@ -136,45 +134,27 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * * MACROS **********************/ -#define ROUND_UP(x, align) ((x + (align - 1)) & ~(align - 1)) - /********************** * GLOBAL FUNCTIONS **********************/ -lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color, lv_opa_t opa) +void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + lv_color_t color, lv_opa_t opa) { - uint32_t area_size = lv_area_get_size(fill_area); - lv_coord_t area_w = lv_area_get_width(fill_area); - lv_coord_t area_h = lv_area_get_height(fill_area); - - if(opa >= (lv_opa_t)LV_OPA_MAX) { - if(area_size < LV_GPU_NXP_PXP_FILL_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_SIZE_LIMIT); - return LV_RES_INV; - } - } - else { - if(area_size < LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT); - return LV_RES_INV; - } - } + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + lv_gpu_nxp_pxp_reset(); /*OUT buffer configure*/ pxp_output_buffer_config_t outputConfig = { .pixelFormat = PXP_OUT_PIXEL_FORMAT, .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)(dest_buf + dest_stride * fill_area->y1 + fill_area->x1), + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), .buffer1Addr = (uint32_t)NULL, .pitchBytes = dest_stride * sizeof(lv_color_t), - .width = area_w, - .height = area_h + .width = dest_w, + .height = dest_h }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputConfig); @@ -193,7 +173,7 @@ lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, cons }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, area_w, area_h); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); } /*Disable PS, use as color generator*/ @@ -223,34 +203,19 @@ lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, cons PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig); - lv_gpu_nxp_pxp_run(); /*Start PXP task*/ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } -lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle) +void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa, lv_disp_rot_t angle) { - uint32_t dest_size = lv_area_get_size(dest_area); lv_coord_t dest_w = lv_area_get_width(dest_area); lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t src_w = lv_area_get_width(src_area); + lv_coord_t src_h = lv_area_get_height(src_area); - if(opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT); - return LV_RES_INV; - } - } - else { - if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT); - return LV_RES_INV; - } - } - - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + lv_gpu_nxp_pxp_reset(); /* convert rotation angle */ pxp_rotate_degree_t pxp_rot; @@ -297,19 +262,17 @@ lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, asBlendConfig.alphaMode = kPXP_AlphaOverride; PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig); - PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1); + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); } - lv_coord_t src_stride = lv_area_get_width(src_area); - /*AS buffer - source image*/ pxp_as_buffer_config_t asBufferConfig = { .pixelFormat = PXP_AS_PIXEL_FORMAT, - .bufferAddr = (uint32_t)src_buf, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1), .pitchBytes = src_stride * sizeof(lv_color_t) }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig); PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, false); @@ -325,162 +288,147 @@ lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); - lv_gpu_nxp_pxp_run(); /* Start PXP task */ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } -lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { - uint32_t dest_size = lv_area_get_size(dest_area); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool has_rotation = (dsc->angle != 0); - if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT); - return LV_RES_INV; + if(has_recolor || has_rotation) { + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf)) { + lv_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); + return; } - } - else { - if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT); - return LV_RES_INV; + else { + /*Recolor and/or rotation with alpha or opacity is done in two steps.*/ + lv_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); + return; } } - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); - bool rotation = (dsc->angle != 0); + lv_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); +} - if(rotation) { - if(dsc->angle != 0 && dsc->angle != 900 && dsc->angle != 1800 && dsc->angle != 2700) { - PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); - return LV_RES_INV; - } - } +void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride) +{ + lv_coord_t src_width = lv_area_get_width(src_area); + lv_coord_t src_height = lv_area_get_height(src_area); + + lv_gpu_nxp_pxp_reset(); + + const pxp_pic_copy_config_t picCopyConfig = { + .srcPicBaseAddr = (uint32_t)src_buf, + .srcPitchBytes = src_stride * sizeof(lv_color_t), + .srcOffsetX = src_area->x1, + .srcOffsetY = src_area->y1, + .destPicBaseAddr = (uint32_t)dest_buf, + .destPitchBytes = dest_stride * sizeof(lv_color_t), + .destOffsetX = dest_area->x1, + .destOffsetY = dest_area->y1, + .width = src_width, + .height = src_height, + .pixelFormat = PXP_AS_PIXEL_FORMAT + }; - if(recolor || rotation) { - if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf)) - return lv_gpu_nxp_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); - else - /*Recolor and/or rotation with alpha or opacity is done in two steps.*/ - return lv_gpu_nxp_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); - } + PXP_StartPictureCopy(LV_GPU_NXP_PXP_ID, &picCopyConfig); - return lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); + lv_gpu_nxp_pxp_wait(); } /********************** * STATIC FUNCTIONS **********************/ -static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { - lv_coord_t dest_w = lv_area_get_width(dest_area); - lv_coord_t dest_h = lv_area_get_height(dest_area); - lv_res_t res; - uint32_t size = dest_w * dest_h * sizeof(lv_color_t); - - if(ROUND_UP(size, ALIGN_SIZE) >= LV_MEM_SIZE) - PXP_RETURN_INV("Insufficient memory for temporary buffer. Please increase LV_MEM_SIZE."); - - lv_color_t * tmp_buf = (lv_color_t *)lv_mem_buf_get(size); - if(!tmp_buf) - PXP_RETURN_INV("Allocating temporary buffer failed."); - - const lv_area_t tmp_area = { - .x1 = 0, - .y1 = 0, - .x2 = dest_w - 1, - .y2 = dest_h - 1 - }; + lv_area_t temp_area; + lv_area_copy(&temp_area, dest_area); + lv_coord_t temp_stride = dest_stride; + lv_coord_t temp_w = lv_area_get_width(&temp_area); + lv_coord_t temp_h = lv_area_get_height(&temp_area); /*Step 1: Transform with full opacity to temporary buffer*/ - res = lv_gpu_nxp_pxp_blit_cover(tmp_buf, &tmp_area, dest_w, src_buf, src_area, dsc, cf); - if(res != LV_RES_OK) { - PXP_LOG_TRACE("Blit cover with full opacity failed."); - lv_mem_buf_release(tmp_buf); + lv_pxp_blit_cover((lv_color_t *)temp_buf, &temp_area, temp_stride, src_buf, src_area, src_stride, dsc, cf); - return res; + /*Switch width and height if angle requires it*/ + if(dsc->angle == 900 || dsc->angle == 2700) { + temp_area.x2 = temp_area.x1 + temp_h - 1; + temp_area.y2 = temp_area.y1 + temp_w - 1; } - /*Step 2: Blit temporary results with required opacity to output*/ - res = lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, tmp_buf, &tmp_area, dsc, cf); - - /*Clean-up memory*/ - lv_mem_buf_release(tmp_buf); - - return res; + /*Step 2: Blit temporary result with required opacity to output*/ + lv_pxp_blit_cf(dest_buf, &temp_area, dest_stride, (lv_color_t *)temp_buf, &temp_area, temp_stride, dsc, cf); } - -static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { lv_coord_t dest_w = lv_area_get_width(dest_area); lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t src_w = lv_area_get_width(src_area); + lv_coord_t src_h = lv_area_get_height(src_area); - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); - bool rotation = (dsc->angle != 0); - - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ - - if(rotation) { - /* - * PXP is set to process 16x16 blocks to optimize the system for memory - * bandwidth and image processing time. - * The output engine essentially truncates any output pixels after the - * desired number of pixels has been written. - * When rotating a source image and the output is not divisible by the block - * size, the incorrect pixels could be truncated and the final output image - * can look shifted. - */ - if(lv_area_get_width(src_area) % 16 || lv_area_get_height(src_area) % 16) { - PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16."); - return LV_RES_INV; - } + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool has_rotation = (dsc->angle != 0); - /*Convert rotation angle*/ - pxp_rotate_degree_t pxp_rot; + lv_point_t pivot = dsc->pivot; + lv_coord_t piv_offset_x; + lv_coord_t piv_offset_y; + + lv_gpu_nxp_pxp_reset(); + + if(has_rotation) { + /*Convert rotation angle and calculate offsets caused by pivot*/ + pxp_rotate_degree_t pxp_angle; switch(dsc->angle) { case 0: - pxp_rot = kPXP_Rotate0; + pxp_angle = kPXP_Rotate0; + piv_offset_x = 0; + piv_offset_y = 0; break; case 900: - pxp_rot = kPXP_Rotate90; + piv_offset_x = pivot.x + pivot.y - dest_h; + piv_offset_y = pivot.y - pivot.x; + pxp_angle = kPXP_Rotate90; break; case 1800: - pxp_rot = kPXP_Rotate180; + piv_offset_x = 2 * pivot.x - dest_w; + piv_offset_y = 2 * pivot.y - dest_h; + pxp_angle = kPXP_Rotate180; break; case 2700: - pxp_rot = kPXP_Rotate270; + piv_offset_x = pivot.x - pivot.y; + piv_offset_y = pivot.x + pivot.y - dest_w; + pxp_angle = kPXP_Rotate270; break; default: - PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); - return LV_RES_INV; + piv_offset_x = 0; + piv_offset_y = 0; + pxp_angle = kPXP_Rotate0; } - PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable); + PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable); + lv_area_move(dest_area, piv_offset_x, piv_offset_y); } - lv_coord_t src_stride = lv_area_get_width(src_area); - /*AS buffer - source image*/ pxp_as_buffer_config_t asBufferConfig = { .pixelFormat = PXP_AS_PIXEL_FORMAT, - .bufferAddr = (uint32_t)src_buf, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1), .pitchBytes = src_stride * sizeof(lv_color_t) }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); /*Disable PS buffer*/ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - if(recolor) + if(has_recolor) /*Use as color generator*/ PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(dsc->recolor)); @@ -496,7 +444,7 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); - if(recolor || lv_img_cf_has_alpha(cf)) { + if(has_recolor || lv_img_cf_has_alpha(cf)) { /** * Configure Porter-Duff blending. * @@ -512,7 +460,7 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t .srcGlobalAlphaMode = lv_img_cf_has_alpha(cf) ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha, .dstFactorMode = kPXP_PorterDuffFactorStraight, .srcFactorMode = kPXP_PorterDuffFactorInversed, - .dstGlobalAlpha = recolor ? dsc->recolor_opa : 0x00, + .dstGlobalAlpha = has_recolor ? dsc->recolor_opa : 0x00, .srcGlobalAlpha = 0xff, .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ .srcAlphaMode = kPXP_PorterDuffAlphaStraight @@ -520,22 +468,19 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig); } - lv_gpu_nxp_pxp_run(); /*Start PXP task*/ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } -static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +static void lv_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { lv_coord_t dest_w = lv_area_get_width(dest_area); lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t src_w = lv_area_get_width(src_area); + lv_coord_t src_h = lv_area_get_height(src_area); - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + lv_gpu_nxp_pxp_reset(); pxp_as_blend_config_t asBlendConfig = { .alpha = dsc->opa, @@ -566,28 +511,26 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaMultiply : kPXP_AlphaOverride; } PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig); - PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1); + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); } - lv_coord_t src_stride = lv_area_get_width(src_area); - /*AS buffer - source image*/ pxp_as_buffer_config_t asBufferConfig = { .pixelFormat = PXP_AS_PIXEL_FORMAT, - .bufferAddr = (uint32_t)src_buf, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1), .pitchBytes = src_stride * sizeof(lv_color_t) }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig); if(lv_img_cf_is_chroma_keyed(cf)) { lv_color_t colorKeyLow = LV_COLOR_CHROMA_KEY; lv_color_t colorKeyHigh = LV_COLOR_CHROMA_KEY; - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); - if(recolor) { + if(has_recolor) { /* New color key after recoloring */ lv_color_t colorKey = lv_color_mix(dsc->recolor, LV_COLOR_CHROMA_KEY, dsc->recolor_opa); @@ -595,11 +538,11 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * LV_COLOR_SET_G(colorKeyLow, colorKey.ch.green != 0 ? colorKey.ch.green - 1 : 0); LV_COLOR_SET_B(colorKeyLow, colorKey.ch.blue != 0 ? colorKey.ch.blue - 1 : 0); -#if LV_COLOR_DEPTH==16 +#if LV_COLOR_DEPTH == 16 LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0x1f ? colorKey.ch.red + 1 : 0x1f); LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0x3f ? colorKey.ch.green + 1 : 0x3f); LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0x1f ? colorKey.ch.blue + 1 : 0x1f); -#else /*LV_COLOR_DEPTH==32*/ +#else /*LV_COLOR_DEPTH == 32*/ LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0xff ? colorKey.ch.red + 1 : 0xff); LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0xff ? colorKey.ch.green + 1 : 0xff); LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0xff ? colorKey.ch.blue + 1 : 0xff); @@ -624,9 +567,7 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); - lv_gpu_nxp_pxp_run(); /* Start PXP task */ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } #endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h index 43a6440..9615667 100644 --- a/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h +++ b/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -48,31 +48,6 @@ extern "C" { * DEFINES *********************/ -#ifndef LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with 100% opacity to be handled by PXP*/ -#define LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with transparency to be handled by PXP*/ -#define LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT -/** Minimum invalidated area (in pixels) to be synchronized by PXP during buffer sync */ -#define LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_FILL_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by PXP with 100% opacity*/ -#define LV_GPU_NXP_PXP_FILL_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by PXP with transparency*/ -#define LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT 5000 -#endif - /********************** * TYPEDEFS **********************/ @@ -84,51 +59,63 @@ extern "C" { /** * Fill area, with optional opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] fill_area area to fill - * @param[in] color color - * @param[in] opa transparency of the color - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] color Color + * @param[in] opa Opacity */ -lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color, lv_opa_t opa); +void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + lv_color_t color, lv_opa_t opa); /** * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. * By default, image is copied directly, with optional opacity. This function can also * rotate the display output buffer to a specified angle (90x step). * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area destination area - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] opa opacity of the result - * @param[in] angle display rotation angle (90x) - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * @param[in] angle Display rotation angle (90x) */ -lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle); +void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa, lv_disp_rot_t angle); /** * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. * * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area destination area - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format + */ +void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf, no transformation or blending. + * + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels */ -lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride); /********************** * MACROS diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c b/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c index 94d242a..164216f 100644 --- a/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c +++ b/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -50,9 +50,9 @@ **********************/ /** - * Clean & invalidate cache. + * Clean and invalidate cache. */ -static void invalidate_cache(void); +static inline void invalidate_cache(void); /********************** * STATIC VARIABLES @@ -70,16 +70,23 @@ static lv_nxp_pxp_cfg_t * pxp_cfg; lv_res_t lv_gpu_nxp_pxp_init(void) { +#if LV_USE_GPU_NXP_PXP_AUTO_INIT pxp_cfg = lv_gpu_nxp_pxp_get_cfg(); +#endif - if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init || !pxp_cfg->pxp_run) + if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init || + !pxp_cfg->pxp_run || !pxp_cfg->pxp_wait) PXP_RETURN_INV("PXP configuration error."); PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); if(pxp_cfg->pxp_interrupt_init() != LV_RES_OK) { + PXP_DisableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); PXP_Deinit(LV_GPU_NXP_PXP_ID); PXP_RETURN_INV("PXP interrupt init failed."); } @@ -90,23 +97,38 @@ lv_res_t lv_gpu_nxp_pxp_init(void) void lv_gpu_nxp_pxp_deinit(void) { pxp_cfg->pxp_interrupt_deinit(); - PXP_DisableInterrupts(PXP, kPXP_CompleteInterruptEnable); + PXP_DisableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); PXP_Deinit(LV_GPU_NXP_PXP_ID); } +void lv_gpu_nxp_pxp_reset(void) +{ + /* Wait for previous command to complete before resetting the registers. */ + lv_gpu_nxp_pxp_wait(); + + PXP_ResetControl(LV_GPU_NXP_PXP_ID); + + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ +} + void lv_gpu_nxp_pxp_run(void) { - /*Clean & invalidate cache*/ invalidate_cache(); pxp_cfg->pxp_run(); } +void lv_gpu_nxp_pxp_wait(void) +{ + pxp_cfg->pxp_wait(); +} + /********************** * STATIC FUNCTIONS **********************/ -static void invalidate_cache(void) +static inline void invalidate_cache(void) { lv_disp_t * disp = _lv_refr_get_disp_refreshing(); if(disp->driver->clean_dcache_cb) diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h index e695d8f..46f4a0b 100644 --- a/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h +++ b/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -81,8 +81,11 @@ typedef struct { /** Callback for PXP interrupt de-initialization*/ void (*pxp_interrupt_deinit)(void); - /** Callback that should start PXP and wait for operation complete*/ + /** Callback for PXP start*/ void (*pxp_run)(void); + + /** Callback for waiting of PXP completion*/ + void (*pxp_wait)(void); } lv_nxp_pxp_cfg_t; /********************** @@ -104,10 +107,20 @@ lv_res_t lv_gpu_nxp_pxp_init(void); void lv_gpu_nxp_pxp_deinit(void); /** - * Start PXP job and wait for completion. + * Reset PXP device. + */ +void lv_gpu_nxp_pxp_reset(void); + +/** + * Clear cache and start PXP. */ void lv_gpu_nxp_pxp_run(void); +/** + * Wait for PXP completion. + */ +void lv_gpu_nxp_pxp_wait(void); + /********************** * MACROS **********************/ @@ -136,7 +149,7 @@ void lv_gpu_nxp_pxp_run(void); #if LV_GPU_NXP_PXP_LOG_TRACES #define PXP_LOG_TRACE(fmt, ...) \ do { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG(fmt, ##__VA_ARGS__); \ } while (0) #else #define PXP_LOG_TRACE(fmt, ...) \ diff --git a/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c b/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c index c4b8dbe..8e18840 100644 --- a/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c +++ b/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020, 2022 NXP + * Copyright 2020, 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -65,24 +65,29 @@ static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void); static void _lv_gpu_nxp_pxp_interrupt_deinit(void); /** - * Start the PXP job and wait for task completion. + * Start the PXP job. */ static void _lv_gpu_nxp_pxp_run(void); +/** + * Wait for PXP completion. + */ +static void _lv_gpu_nxp_pxp_wait(void); + /********************** * STATIC VARIABLES **********************/ #if defined(SDK_OS_FREE_RTOS) - static SemaphoreHandle_t s_pxpIdle; -#else - static volatile bool s_pxpIdle; + static SemaphoreHandle_t s_pxpIdleSem; #endif +static volatile bool s_pxpIdle; static lv_nxp_pxp_cfg_t pxp_default_cfg = { .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init, .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit, - .pxp_run = _lv_gpu_nxp_pxp_run + .pxp_run = _lv_gpu_nxp_pxp_run, + .pxp_wait = _lv_gpu_nxp_pxp_wait, }; /********************** @@ -102,7 +107,7 @@ void PXP_IRQHandler(void) if(kPXP_CompleteFlag & PXP_GetStatusFlags(LV_GPU_NXP_PXP_ID)) { PXP_ClearStatusFlags(LV_GPU_NXP_PXP_ID, kPXP_CompleteFlag); #if defined(SDK_OS_FREE_RTOS) - xSemaphoreGiveFromISR(s_pxpIdle, &taskAwake); + xSemaphoreGiveFromISR(s_pxpIdleSem, &taskAwake); portYIELD_FROM_ISR(taskAwake); #else s_pxpIdle = true; @@ -122,14 +127,13 @@ lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void) static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void) { #if defined(SDK_OS_FREE_RTOS) - s_pxpIdle = xSemaphoreCreateBinary(); - if(s_pxpIdle == NULL) + s_pxpIdleSem = xSemaphoreCreateBinary(); + if(s_pxpIdleSem == NULL) return LV_RES_INV; NVIC_SetPriority(LV_GPU_NXP_PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1); -#else - s_pxpIdle = true; #endif + s_pxpIdle = true; NVIC_EnableIRQ(LV_GPU_NXP_PXP_IRQ_ID); @@ -140,21 +144,33 @@ static void _lv_gpu_nxp_pxp_interrupt_deinit(void) { NVIC_DisableIRQ(LV_GPU_NXP_PXP_IRQ_ID); #if defined(SDK_OS_FREE_RTOS) - vSemaphoreDelete(s_pxpIdle); + vSemaphoreDelete(s_pxpIdleSem); #endif } +/** + * Function to start PXP job. + */ static void _lv_gpu_nxp_pxp_run(void) { -#if !defined(SDK_OS_FREE_RTOS) s_pxpIdle = false; -#endif PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); PXP_Start(LV_GPU_NXP_PXP_ID); +} +/** + * Function to wait for PXP completion. + */ +static void _lv_gpu_nxp_pxp_wait(void) +{ #if defined(SDK_OS_FREE_RTOS) - PXP_COND_STOP(!xSemaphoreTake(s_pxpIdle, portMAX_DELAY), "xSemaphoreTake failed."); + /* Return if PXP was never started, otherwise the semaphore will lock forever. */ + if(s_pxpIdle == true) + return; + + if(xSemaphoreTake(s_pxpIdleSem, portMAX_DELAY) == pdTRUE) + s_pxpIdle = true; #else while(s_pxpIdle == false) { } diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk b/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk index c84e2e4..c9473cc 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk @@ -1,7 +1,10 @@ +CSRCS += lv_draw_vglite.c CSRCS += lv_draw_vglite_arc.c CSRCS += lv_draw_vglite_blend.c +CSRCS += lv_draw_vglite_line.c CSRCS += lv_draw_vglite_rect.c -CSRCS += lv_gpu_nxp_vglite.c +CSRCS += lv_vglite_buf.c +CSRCS += lv_vglite_utils.c DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c new file mode 100644 index 0000000..031f57e --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c @@ -0,0 +1,557 @@ +/** + * @file lv_draw_vglite.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include +#include "lv_draw_vglite_blend.h" +#include "lv_draw_vglite_line.h" +#include "lv_draw_vglite_rect.h" +#include "lv_draw_vglite_arc.h" +#include "lv_vglite_buf.h" + +#if LV_COLOR_DEPTH != 32 + #include "../../../core/lv_refr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/* Minimum area (in pixels) for VG-Lite blit/fill processing. */ +#ifndef LV_GPU_NXP_VG_LITE_SIZE_LIMIT + #define LV_GPU_NXP_VG_LITE_SIZE_LIMIT 5000 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_vglite_init_buf(lv_draw_ctx_t * draw_ctx); + +static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx); + +static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); + +static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + +static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2); + +static void lv_draw_vglite_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); + +static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); + +static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_vglite_ctx_t * vglite_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf; + vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line; + vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc; + vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect; + vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded; + vglite_draw_ctx->blend = lv_draw_vglite_blend; + vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish; + vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy; +} + +void lv_draw_vglite_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_deinit_ctx(drv, draw_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * During rendering, LVGL might initializes new draw_ctxs and start drawing into + * a separate buffer (called layer). If the content to be rendered has "holes", + * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. + * It means the renderers should draw into an ARGB buffer. + * With 32 bit color depth it's not a big problem but with 16 bit color depth + * the target pixel format is ARGB8565 which is not supported by the GPU. + * In this case, the VG-Lite callbacks should fallback to SW rendering. + */ +static inline bool need_argb8565_support() +{ +#if LV_COLOR_DEPTH != 32 + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + if(disp->driver->screen_transp == 1) + return true; +#endif + + return false; +} + +static void lv_draw_vglite_init_buf(lv_draw_ctx_t * draw_ctx) +{ + lv_gpu_nxp_vglite_init_buf(draw_ctx->buf, draw_ctx->buf_area, lv_area_get_width(draw_ctx->buf_area)); +} + +static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx) +{ + vg_lite_finish(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool done = false; + /*Fill/Blend only non masked, normal blended*/ + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && + lv_area_get_size(&blend_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) { + const lv_color_t * src_buf = dsc->src_buf; + + if(src_buf == NULL) { + done = (lv_gpu_nxp_vglite_fill(&blend_area, dsc->color, dsc->opa) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback."); + } + else { + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + +#if VG_LITE_BLIT_SPLIT_ENABLED + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride, + src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#else + done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#endif + + if(!done) + VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback."); + } + } + + if(!done) + lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + const lv_color_t * src_buf = (const lv_color_t *)map_p; + if(!src_buf) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t blend_area; + bool has_transform = dsc->angle != 0 || dsc->zoom != LV_IMG_ZOOM_NONE; + + if(has_transform) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&blend_area); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + + bool done = false; + if(!has_mask && !has_recolor && !lv_img_cf_is_chroma_keyed(cf) && + lv_area_get_size(&blend_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT +#if LV_COLOR_DEPTH != 32 + && !lv_img_cf_has_alpha(cf) +#endif + ) { + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(coords) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(coords) - 1; + lv_coord_t src_stride = lv_area_get_width(coords); + +#if VG_LITE_BLIT_SPLIT_ENABLED + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + if(has_transform) + /* VG-Lite blit split with transformation is not supported! */ + done = false; + else + done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride, + src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#else + if(has_transform) + done = (lv_gpu_nxp_vglite_blit_transform(&blend_area, &rel_clip_area, + src_buf, &src_area, src_stride, dsc) == LV_RES_OK); + else + done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#endif + + if(!done) + VG_LITE_LOG_TRACE("VG-Lite blit %sfailed. Fallback.", has_transform ? "transform " : ""); + } + + if(!done) + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); +} + +static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + bool done = false; + + if(lv_area_get_size(dest_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) { + done = lv_gpu_nxp_vglite_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite buffer copy failed. Fallback."); + } + + if(!done) + lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area); +} + +static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2) +{ + if(dsc->width == 0) + return; + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(point1->x == point2->x && point1->y == point2->y) + return; + + if(need_argb8565_support()) { + lv_draw_sw_line(draw_ctx, dsc, point1, point2); + return; + } + + lv_area_t rel_clip_area; + rel_clip_area.x1 = LV_MIN(point1->x, point2->x) - dsc->width / 2; + rel_clip_area.x2 = LV_MAX(point1->x, point2->x) + dsc->width / 2; + rel_clip_area.y1 = LV_MIN(point1->y, point2->y) - dsc->width / 2; + rel_clip_area.y2 = LV_MAX(point1->y, point2->y) + dsc->width / 2; + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_clip_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_point_t rel_point1 = { point1->x - draw_ctx->buf_area->x1, point1->y - draw_ctx->buf_area->y1 }; + lv_point_t rel_point2 = { point2->x - draw_ctx->buf_area->x1, point2->y - draw_ctx->buf_area->y1 }; + + bool done = false; + bool has_mask = lv_draw_mask_is_any(&rel_clip_area); + + if(!has_mask) { + done = (lv_gpu_nxp_vglite_draw_line(&rel_point1, &rel_point2, &rel_clip_area, dsc) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite draw line failed. Fallback."); + } + + if(!done) + lv_draw_sw_line(draw_ctx, dsc, point1, point2); +} + +static void lv_draw_vglite_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(need_argb8565_support()) { + lv_draw_sw_rect(draw_ctx, dsc, coords); + return; + } + + lv_draw_rect_dsc_t vglite_dsc; + + lv_memcpy(&vglite_dsc, dsc, sizeof(vglite_dsc)); + vglite_dsc.bg_opa = 0; + vglite_dsc.bg_img_opa = 0; + vglite_dsc.border_opa = 0; + vglite_dsc.outline_opa = 0; +#if LV_DRAW_COMPLEX + /* Draw the shadow with CPU */ + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.shadow_opa = 0; +#endif /*LV_DRAW_COMPLEX*/ + + /* Draw the background */ + vglite_dsc.bg_opa = dsc->bg_opa; + if(lv_draw_vglite_bg(draw_ctx, &vglite_dsc, coords) != LV_RES_OK) + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.bg_opa = 0; + + /* Draw the background image + * It will be done once draw_ctx->draw_img_decoded() + * callback gets called from lv_draw_sw_rect(). + */ + vglite_dsc.bg_img_opa = dsc->bg_img_opa; + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.bg_img_opa = 0; + + /* Draw the border */ + vglite_dsc.border_opa = dsc->border_opa; + if(lv_draw_vglite_border(draw_ctx, &vglite_dsc, coords) != LV_RES_OK) + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.border_opa = 0; + + /* Draw the outline */ + vglite_dsc.outline_opa = dsc->outline_opa; + if(lv_draw_vglite_outline(draw_ctx, &vglite_dsc, coords) != LV_RES_OK) + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); +} + +static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->bg_opa <= (lv_opa_t)LV_OPA_MIN) + return LV_RES_INV; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) { + rel_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + rel_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + rel_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + rel_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&rel_coords); + lv_grad_dir_t grad_dir = dsc->bg_grad.dir; + lv_color_t bg_color = (grad_dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) ? + dsc->bg_color : dsc->bg_grad.stops[0].color; + if(bg_color.full == dsc->bg_grad.stops[1].color.full) + grad_dir = LV_GRAD_DIR_NONE; + + /* + * Most simple case: just a plain rectangle (no mask, no radius, no gradient) + * shall be handled by draw_ctx->blend(). + * + * Complex case: gradient or radius but no mask. + */ + if(!has_mask && ((dsc->radius != 0) || (grad_dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE))) { + lv_res_t res = lv_gpu_nxp_vglite_draw_bg(&rel_coords, &rel_clip_area, dsc); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback."); + + return res; + } + + return LV_RES_INV; +} + +static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->border_opa <= (lv_opa_t)LV_OPA_MIN) + return LV_RES_INV; + if(dsc->border_width == 0) + return LV_RES_INV; + if(dsc->border_post) + return LV_RES_INV; + if(dsc->border_side != (lv_border_side_t)LV_BORDER_SIDE_FULL) + return LV_RES_INV; + + lv_area_t rel_coords; + lv_coord_t border_width = dsc->border_width; + + /* Move border inwards to align with software rendered border */ + rel_coords.x1 = coords->x1 + ceil(border_width / 2.0f); + rel_coords.x2 = coords->x2 - floor(border_width / 2.0f); + rel_coords.y1 = coords->y1 + ceil(border_width / 2.0f); + rel_coords.y2 = coords->y2 - floor(border_width / 2.0f); + + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, true); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw border failed. Fallback."); + + return res; +} + +static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->outline_opa <= (lv_opa_t)LV_OPA_MIN) + return LV_RES_INV; + if(dsc->outline_width == 0) + return LV_RES_INV; + + /* Move outline outwards to align with software rendered outline */ + lv_coord_t outline_pad = dsc->outline_pad - 1; + lv_area_t rel_coords; + rel_coords.x1 = coords->x1 - outline_pad - floor(dsc->outline_width / 2.0f); + rel_coords.x2 = coords->x2 + outline_pad + ceil(dsc->outline_width / 2.0f); + rel_coords.y1 = coords->y1 - outline_pad - floor(dsc->outline_width / 2.0f); + rel_coords.y2 = coords->y2 + outline_pad + ceil(dsc->outline_width / 2.0f); + + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, false); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw outline failed. Fallback."); + + return res; +} + +static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle) +{ + bool done = false; + +#if LV_DRAW_COMPLEX + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(start_angle == end_angle) + return; + + if(need_argb8565_support()) { + lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); + return; + } + + lv_point_t rel_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1}; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool has_mask = lv_draw_mask_is_any(&rel_clip_area); + + if(!has_mask) { + done = (lv_gpu_nxp_vglite_draw_arc(&rel_center, (int32_t)radius, (int32_t)start_angle, (int32_t)end_angle, + &rel_clip_area, dsc) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); + } + +#endif/*LV_DRAW_COMPLEX*/ + + if(!done) + lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h new file mode 100644 index 0000000..c44cb8f --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h @@ -0,0 +1,72 @@ +/** + * @file lv_draw_vglite.h + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_H +#define LV_DRAW_VGLITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_vglite_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_vglite_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_vglite_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_H*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c index 194f03d..ef6d25a 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2021-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,8 @@ #include "lv_draw_vglite_arc.h" #if LV_USE_GPU_NXP_VG_LITE -#include "math.h" +#include "lv_vglite_buf.h" +#include /********************* * DEFINES @@ -88,7 +89,7 @@ typedef struct _cubic_cont_pt { static void rotate_point(int32_t angle, int32_t * x, int32_t * y); static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, - int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw); + int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw); /********************** * STATIC VARIABLES @@ -102,31 +103,20 @@ static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, * GLOBAL FUNCTIONS **********************/ -lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - int32_t radius, int32_t start_angle, int32_t end_angle) +lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, int32_t start_angle, int32_t end_angle, + const lv_area_t * clip_area, const lv_draw_arc_dsc_t * dsc) { - - vg_lite_buffer_t vgbuf; vg_lite_error_t err = VG_LITE_SUCCESS; lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; /*Convert color to RGBA8888*/ - lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); - lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); vg_lite_path_t path; vg_lite_color_t vgcol; /* vglite takes ABGR */ - vg_lite_matrix_t matrix; - lv_opa_t opa = dsc->opa; bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false; - lv_point_t clip_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1}; + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); /* path: max size = 16 cubic bezier (7 words each) */ int32_t arc_path[16 * 7]; lv_memset_00(arc_path, sizeof(arc_path)); - /*** Init destination buffer ***/ - if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), - (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - /*** Init path ***/ lv_coord_t width = dsc->width; /* inner arc radius = outer arc radius - width */ if(width > (lv_coord_t)radius) @@ -140,11 +130,11 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_MOVE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; /* draw 1-5 outer quarters */ - add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, clip_center, true); + add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, center, true); if(donut) { /* close outer circle */ @@ -152,24 +142,24 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; /* start inner circle */ cp_x = radius - width; cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_MOVE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } else if(dsc->rounded != 0U) { /* 1st rounded arc ending */ cp_x = radius - width / 2; cp_y = 0; rotate_point(end_angle, &cp_x, &cp_y); - lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y}; + lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180), - round_center, true); + &round_center, true); } else { /* 1st flat ending */ @@ -177,12 +167,12 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(end_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } /* draw 1-5 inner quarters */ - add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, clip_center, false); + add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, center, false); /* last control point of curve */ if(donut) { /* close the loop */ @@ -190,17 +180,17 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } else if(dsc->rounded != 0U) { /* 2nd rounded arc ending */ cp_x = radius - width / 2; cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); - lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y}; + lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360), - round_center, true); + &round_center, true); } else { /* 2nd flat ending */ @@ -208,46 +198,34 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } arc_path[pidx++] = VLC_OP_END; err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path, - (vg_lite_float_t) draw_ctx->clip_area->x1, (vg_lite_float_t) draw_ctx->clip_area->y1, - ((vg_lite_float_t) draw_ctx->clip_area->x2) + 1.0f, ((vg_lite_float_t) draw_ctx->clip_area->y2) + 1.0f); + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); VG_LITE_ERR_RETURN_INV(err, "Init path failed."); - /* set rotation angle */ - vg_lite_identity(&matrix); - - if(opa <= (lv_opa_t)LV_OPA_MAX) { - /* Only pre-multiply color if hardware pre-multiplication is not present */ - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); - col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8); - col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8); - } - col32.ch.alpha = opa; - } + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); -#if LV_COLOR_DEPTH==16 - vgcol = col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | - (uint32_t)col32.ch.red; -#endif + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); + lv_vglite_set_scissor(clip_area); /*** Draw arc ***/ - err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw arc failed."); - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); @@ -564,50 +542,50 @@ static void get_arc_control_points(vg_arc * arc, bool start) * center: (in) the center of the circle in draw coordinates * cw: (in) true if arc is clockwise */ -static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, lv_point_t center, bool cw) +static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, const lv_point_t * center, bool cw) { /* assumes first control point already in array arc_path[] */ int idx = *pidx; if(cw) { #if BEZIER_DBG_CONTROL_POINTS arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p3x + center.x; - arc_path[idx++] = q_arc->p3y + center.y; + arc_path[idx++] = q_arc->p3x + center->x; + arc_path[idx++] = q_arc->p3y + center->y; #else arc_path[idx++] = VLC_OP_CUBIC; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; - arc_path[idx++] = q_arc->p3x + center.x; - arc_path[idx++] = q_arc->p3y + center.y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = q_arc->p3x + center->x; + arc_path[idx++] = q_arc->p3y + center->y; #endif } else { /* reverse points order when counter-clockwise */ #if BEZIER_DBG_CONTROL_POINTS arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p0x + center.x; - arc_path[idx++] = q_arc->p0y + center.y; + arc_path[idx++] = q_arc->p0x + center->x; + arc_path[idx++] = q_arc->p0y + center->y; #else arc_path[idx++] = VLC_OP_CUBIC; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; - arc_path[idx++] = q_arc->p0x + center.x; - arc_path[idx++] = q_arc->p0y + center.y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = q_arc->p0x + center->x; + arc_path[idx++] = q_arc->p0y + center->y; #endif } /* update index i n path array*/ @@ -615,8 +593,10 @@ static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, l } static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, - int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw) + int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw) { + if(end_angle < start_angle) end_angle += 360; + /* set number of arcs to draw */ vg_arc q_arc; int32_t start_arc_angle = start_angle % 90; diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h index 98ba8a3..0fbff3d 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2021-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -40,7 +40,7 @@ extern "C" { #include "../../../lv_conf_internal.h" #if LV_USE_GPU_NXP_VG_LITE -#include "lv_gpu_nxp_vglite.h" +#include "lv_vglite_utils.h" /********************* * DEFINES @@ -54,17 +54,21 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -/*** +/** * Draw arc shape with effects - * @param draw_ctx drawing context - * @param dsc the arc description structure (width, rounded ending, opacity) - * @param center the coordinates of the arc center - * @param radius the radius of external arc - * @param start_angle the starting angle in degrees - * @param end_angle the ending angle in degrees + * + * @param[in] center Arc center with relative coordinates + * @param[in] radius Radius of external arc + * @param[in] start_angle Starting angle in degrees + * @param[in] end_angle Ending angle in degrees + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Arc description structure (width, rounded ending, opacity) + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - int32_t radius, int32_t start_angle, int32_t end_angle); +lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, int32_t start_angle, int32_t end_angle, + const lv_area_t * clip_area, const lv_draw_arc_dsc_t * dsc); /********************** * MACROS diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c index b59b143..4a15fd5 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,30 +34,24 @@ #include "lv_draw_vglite_blend.h" #if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_buf.h" +#include "lv_vglite_utils.h" /********************* * DEFINES *********************/ -/* Enable BLIT quality degradation workaround for RT595, recommended for screen's dimension > 352 pixels */ -#define RT595_BLIT_WRKRND_ENABLED 1 +/** Stride in px required by VG-Lite HW*/ +#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U -/* Internal compound symbol */ -#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ - defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ - RT595_BLIT_WRKRND_ENABLED -#define VG_LITE_BLIT_SPLIT_ENABLED 1 -#else -#define VG_LITE_BLIT_SPLIT_ENABLED 0 +#if VG_LITE_BLIT_SPLIT_ENABLED + /** + * BLIT split threshold - BLITs with width or height higher than this value will be done + * in multiple steps. Value must be 16-aligned. Don't change. + */ + #define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352 #endif -/** - * BLIT split threshold - BLITs with width or height higher than this value will be done - * in multiple steps. Value must be 16-aligned. Don't change. - */ -#define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352 - - /********************** * TYPEDEFS **********************/ @@ -67,63 +61,85 @@ **********************/ /** - * BLock Image Transfer - single direct BLIT. + * Blit image, with optional opacity. + * + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] opa Opacity * - * @param[in] blit Description of the transfer * @retval LV_RES_OK Transfer complete * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit); +static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa); -#if VG_LITE_BLIT_SPLIT_ENABLED +/** + * Check source memory and stride alignment. + * + * @param[in] src_buf Source buffer + * @param[in] src_stride Stride of source buffer in pixels + * + * @retval LV_RES_OK Alignment OK + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +static lv_res_t check_src_alignment(const lv_color_t * src_buf, lv_coord_t src_stride); - /** - * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only. - * - * @param[in,out] area Area to be updated - * @param[in,out] buf Pointer to be updated - */ - static void _align_x(lv_area_t * area, lv_color_t ** buf); +/** + * Creates matrix that translates to origin of given destination area. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + */ +static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area); - /** - * Move buffer pointer to the area start and update variables, Y-axis only. - * - * @param[in,out] area Area to be updated - * @param[in,out] buf Pointer to be updated - * @param[in] stridePx Buffer stride in pixels - */ - static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx); +/** + * Creates matrix that translates to origin of given destination area with transformation (scale or rotate). + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dsc Image descriptor + */ +static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc); - /** - * Software BLIT as a fall-back scenario. - * - * @param[in] blit BLIT configuration - */ - static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit); +#if VG_LITE_BLIT_SPLIT_ENABLED +/** + * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only. + * + * @param[in/out] area Area to be updated + * @param[in/out] buf Pointer to be updated + */ +static void align_x(lv_area_t * area, lv_color_t ** buf); - /** - * Verify BLIT structure - widths, stride, pointer alignment - * - * @param[in] blit BLIT configuration - * @retval LV_RES_OK - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ - static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit); +/** + * Move buffer pointer to the area start and update variables, Y-axis only. + * + * @param[in/out] area Area to be updated + * @param[in/out] buf Pointer to be updated + * @param[in] stride Buffer stride in pixels + */ +static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride); - /** - * BLock Image Transfer - split BLIT. - * - * @param[in] blit BLIT configuration - * @retval LV_RES_OK Transfer complete - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ - static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit); -#endif +/** + * Blit image split in tiles, with optional opacity. + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ /********************** * STATIC VARIABLES **********************/ +static vg_lite_matrix_t vgmatrix; + /********************** * MACROS **********************/ @@ -132,98 +148,57 @@ static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * b * GLOBAL FUNCTIONS **********************/ -lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa) +lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa) { - uint32_t area_size = lv_area_get_size(fill_area); - lv_coord_t area_w = lv_area_get_width(fill_area); - lv_coord_t area_h = lv_area_get_height(fill_area); - - if(opa >= (lv_opa_t)LV_OPA_MAX) { - if(area_size < LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT); - } - else { - if(area_size < LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT); - } - - vg_lite_buffer_t vgbuf; - vg_lite_rectangle_t rect; vg_lite_error_t err = VG_LITE_SUCCESS; lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/ vg_lite_color_t vgcol; /* vglite takes ABGR */ + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); - if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), - (const lv_color_t *)dest_buf, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); if(opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/ - rect.x = fill_area->x1; - rect.y = fill_area->y1; - rect.width = area_w; - rect.height = area_h; - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); - -#if LV_COLOR_DEPTH==16 - vgcol = col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | - (uint32_t)col32.ch.red; -#endif + vg_lite_rectangle_t rect = { + .x = dest_area->x1, + .y = dest_area->y1, + .width = lv_area_get_width(dest_area), + .height = lv_area_get_height(dest_area) + }; - err = vg_lite_clear(&vgbuf, &rect, vgcol); + err = vg_lite_clear(vgbuf, &rect, vgcol); VG_LITE_ERR_RETURN_INV(err, "Clear failed."); - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); } else { /*fill with transparency*/ vg_lite_path_t path; int32_t path_data[] = { /*VG rectangular path*/ - VLC_OP_MOVE, fill_area->x1, fill_area->y1, - VLC_OP_LINE, fill_area->x2 + 1, fill_area->y1, - VLC_OP_LINE, fill_area->x2 + 1, fill_area->y2 + 1, - VLC_OP_LINE, fill_area->x1, fill_area->y2 + 1, - VLC_OP_LINE, fill_area->x1, fill_area->y1, + VLC_OP_MOVE, dest_area->x1, dest_area->y1, + VLC_OP_LINE, dest_area->x2 + 1, dest_area->y1, + VLC_OP_LINE, dest_area->x2 + 1, dest_area->y2 + 1, + VLC_OP_LINE, dest_area->x1, dest_area->y2 + 1, + VLC_OP_LINE, dest_area->x1, dest_area->y1, VLC_OP_END }; err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(path_data), path_data, - (vg_lite_float_t) fill_area->x1, (vg_lite_float_t) fill_area->y1, - ((vg_lite_float_t) fill_area->x2) + 1.0f, ((vg_lite_float_t) fill_area->y2) + 1.0f); + (vg_lite_float_t) dest_area->x1, (vg_lite_float_t) dest_area->y1, + ((vg_lite_float_t) dest_area->x2) + 1.0f, ((vg_lite_float_t) dest_area->y2) + 1.0f); VG_LITE_ERR_RETURN_INV(err, "Init path failed."); - /* Only pre-multiply color if hardware pre-multiplication is not present */ - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); - col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8); - col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8); - } - col32.ch.alpha = opa; - -#if LV_COLOR_DEPTH==16 - vgcol = col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | - (uint32_t)col32.ch.red; -#endif - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); - vg_lite_matrix_t matrix; vg_lite_identity(&matrix); /*Draw rectangle*/ - err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw rectangle failed."); - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); @@ -232,41 +207,128 @@ lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv return LV_RES_OK; } -lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit) +#if VG_LITE_BLIT_SPLIT_ENABLED +lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) { - uint32_t dest_size = lv_area_get_size(&blit->dst_area); + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT); - } - else { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT); - } + lv_color_t * orig_dest_buf = dest_buf; -#if VG_LITE_BLIT_SPLIT_ENABLED - return _lv_gpu_nxp_vglite_blit_split(blit); -#endif /* non RT595 */ + lv_res_t rv = lv_vglite_blit_split(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, opa); + + /* Restore the original dest_vgbuf memory address. */ + lv_vglite_set_dest_buf_ptr(orig_dest_buf); - /* Just pass down */ - return _lv_gpu_nxp_vglite_blit_single(blit); + return rv; } +#else +lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) +{ + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); -lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit) + /* Set scissor. */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + /* Start blit. */ + lv_res_t rv = lv_vglite_blit(src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return rv; +} + +lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc) { - uint32_t dest_size = lv_area_get_size(&blit->dst_area); + lv_res_t rv = LV_RES_INV; + + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT); + /* Set scissor */ + lv_vglite_set_scissor(clip_area); + + /* Set vgmatrix. */ + lv_vglite_set_transformation_matrix(dest_area, dsc); + + /* Start blit. */ + rv = lv_vglite_blit(src_area, dsc->opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return rv; +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + vg_lite_buffer_t src_vgbuf; + /* Set src_vgbuf structure. */ + lv_vglite_set_buf(&src_vgbuf, src_buf, src_area, src_stride); + + vg_lite_buffer_t dest_vgbuf; + /* Set dest_vgbuf structure. */ + lv_vglite_set_buf(&dest_vgbuf, dest_buf, dest_area, dest_stride); + + uint32_t rect[] = { + (uint32_t)src_area->x1, /* start x */ + (uint32_t)src_area->y1, /* start y */ + (uint32_t)lv_area_get_width(src_area), /* width */ + (uint32_t)lv_area_get_height(src_area) /* height */ + }; + + /* Set scissor. */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + err = vg_lite_blit_rect(&dest_vgbuf, &src_vgbuf, rect, &vgmatrix, + VG_LITE_BLEND_NONE, 0xFFFFFFFFU, VG_LITE_FILTER_POINT); + if(err != VG_LITE_SUCCESS) { + LV_LOG_ERROR("Blit rectangle failed."); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_INV; } - else { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT); + + if(lv_vglite_run() != LV_RES_OK) { + LV_LOG_ERROR("Run failed."); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_INV; } - return _lv_gpu_nxp_vglite_blit_single(blit); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_OK; } /********************** @@ -274,223 +336,210 @@ lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit) **********************/ #if VG_LITE_BLIT_SPLIT_ENABLED -static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit) +static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) { lv_res_t rv = LV_RES_INV; - if(_lv_gpu_nxp_vglite_check_blit(blit) != LV_RES_OK) { - PRINT_BLT("Blit check failed\n"); - return LV_RES_INV; - } - - PRINT_BLT("BLIT from: " - "Area: %03d,%03d - %03d,%03d " - "Addr: %d\n\n", - blit->src_area.x1, blit->src_area.y1, - blit->src_area.x2, blit->src_area.y2, - (uintptr_t) blit->src); - - PRINT_BLT("BLIT to: " - "Area: %03d,%03d - %03d,%03d " - "Addr: %d\n\n", - blit->dst_area.x1, blit->dst_area.y1, - blit->dst_area.x2, blit->dst_area.y2, - (uintptr_t) blit->src); - - /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */ - _align_x(&blit->src_area, (lv_color_t **)&blit->src); - _align_y(&blit->src_area, (lv_color_t **)&blit->src, blit->src_stride / sizeof(lv_color_t)); - _align_x(&blit->dst_area, (lv_color_t **)&blit->dst); - _align_y(&blit->dst_area, (lv_color_t **)&blit->dst, blit->dst_stride / sizeof(lv_color_t)); + VG_LITE_LOG_TRACE("Blit " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); + + /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */ + align_x(src_area, (lv_color_t **)&src_buf); + align_y(src_area, (lv_color_t **)&src_buf, src_stride); + align_x(dest_area, (lv_color_t **)&dest_buf); + align_y(dest_area, (lv_color_t **)&dest_buf, dest_stride); /* Stage 2: If we're in limit, do a single BLIT */ - if((blit->src_area.x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) && - (blit->src_area.y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) { - PRINT_BLT("Simple blit!\n"); - return _lv_gpu_nxp_vglite_blit_single(blit); + if((src_area->x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) && + (src_area->y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) { + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set new dest_vgbuf and src_vgbuf memory addresses. */ + lv_vglite_set_dest_buf_ptr(dest_buf); + lv_vglite_set_src_buf_ptr(src_buf); + + /* Set scissor */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + /* Start blit. */ + rv = lv_vglite_blit(src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + VG_LITE_LOG_TRACE("Single " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x) %s", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf, + rv == LV_RES_OK ? "OK!" : "FAILED!"); + + return rv; }; /* Stage 3: Split the BLIT into multiple tiles */ - PRINT_BLT("Split blit!\n"); - - PRINT_BLT("Blit " - "([%03d,%03d], [%03d,%03d]) -> " - "([%03d,%03d], [%03d,%03d]) | " - "([%03dx%03d] -> [%03dx%03d]) | " - "A:(%d -> %d)\n", - blit->src_area.x1, blit->src_area.y1, blit->src_area.x2, blit->src_area.y2, - blit->dst_area.x1, blit->dst_area.y1, blit->dst_area.x2, blit->dst_area.y2, - lv_area_get_width(&blit->src_area), lv_area_get_height(&blit->src_area), - lv_area_get_width(&blit->dst_area), lv_area_get_height(&blit->dst_area), - (uintptr_t) blit->src, (uintptr_t) blit->dst); - + VG_LITE_LOG_TRACE("Split " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); - lv_coord_t totalWidth = lv_area_get_width(&blit->src_area); - lv_coord_t totalHeight = lv_area_get_height(&blit->src_area); - lv_gpu_nxp_vglite_blit_info_t tileBlit; + lv_coord_t width = lv_area_get_width(src_area); + lv_coord_t height = lv_area_get_height(src_area); /* Number of tiles needed */ - int totalTilesX = (blit->src_area.x1 + totalWidth + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / - LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; - int totalTilesY = (blit->src_area.y1 + totalHeight + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / - LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + int total_tiles_x = (src_area->x1 + width + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + int total_tiles_y = (src_area->y1 + height + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be * different */ - int shiftSrcX = (blit->src_area.x1 > blit->dst_area.x1) ? (blit->src_area.x1 - blit->dst_area.x1) : 0; - int shiftDstX = (blit->src_area.x1 < blit->dst_area.x1) ? (blit->dst_area.x1 - blit->src_area.x1) : 0; + int shift_src_x = (src_area->x1 > dest_area->x1) ? (src_area->x1 - dest_area->x1) : 0; + int shift_dest_x = (src_area->x1 < dest_area->x1) ? (dest_area->x1 - src_area->x1) : 0; - PRINT_BLT("\n"); - PRINT_BLT("Align shift: src: %d, dst: %d\n", shiftSrcX, shiftDstX); + VG_LITE_LOG_TRACE("X shift: src: %d, dst: %d", shift_src_x, shift_dest_x); - tileBlit = *blit; + lv_color_t * tile_dest_buf; + lv_area_t tile_dest_area; + const lv_color_t * tile_src_buf; + lv_area_t tile_src_area; - for(int tileY = 0; tileY < totalTilesY; tileY++) { + for(int y = 0; y < total_tiles_y; y++) { - tileBlit.src_area.y1 = 0; /* no vertical alignment, always start from 0 */ - tileBlit.src_area.y2 = totalHeight - tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - if(tileBlit.src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { - tileBlit.src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */ + tile_src_area.y1 = 0; /* no vertical alignment, always start from 0 */ + tile_src_area.y2 = height - y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tile_src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tile_src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */ } - tileBlit.src = blit->src + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->src_stride / sizeof( - lv_color_t); /* stride in px! */ + tile_src_buf = src_buf + y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * src_stride; - tileBlit.dst_area.y1 = tileBlit.src_area.y1; /* y has no alignment, always in sync with src */ - tileBlit.dst_area.y2 = tileBlit.src_area.y2; + tile_dest_area.y1 = tile_src_area.y1; /* y has no alignment, always in sync with src */ + tile_dest_area.y2 = tile_src_area.y2; - tileBlit.dst = blit->dst + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->dst_stride / sizeof( - lv_color_t); /* stride in px! */ + tile_dest_buf = dest_buf + y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * dest_stride; - for(int tileX = 0; tileX < totalTilesX; tileX++) { + for(int x = 0; x < total_tiles_x; x++) { - if(tileX == 0) { + if(x == 0) { /* 1st tile is special - there may be a gap between buffer start pointer * and area.x1 value, as the pointer has to be aligned. - * tileBlit.src pointer - keep init value from Y-loop. + * tile_src_buf pointer - keep init value from Y-loop. * Also, 1st tile start is not shifted! shift is applied from 2nd tile */ - tileBlit.src_area.x1 = blit->src_area.x1; - tileBlit.dst_area.x1 = blit->dst_area.x1; + tile_src_area.x1 = src_area->x1; + tile_dest_area.x1 = dest_area->x1; } else { /* subsequent tiles always starts from 0, but shifted*/ - tileBlit.src_area.x1 = 0 + shiftSrcX; - tileBlit.dst_area.x1 = 0 + shiftDstX; + tile_src_area.x1 = 0 + shift_src_x; + tile_dest_area.x1 = 0 + shift_dest_x; /* and advance start pointer + 1 tile size */ - tileBlit.src += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; - tileBlit.dst += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + tile_src_buf += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + tile_dest_buf += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; } /* Clip tile end coordinates */ - tileBlit.src_area.x2 = totalWidth + blit->src_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - if(tileBlit.src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { - tileBlit.src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + tile_src_area.x2 = width + src_area->x1 - x * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tile_src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tile_src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; } - tileBlit.dst_area.x2 = totalWidth + blit->dst_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - if(tileBlit.dst_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { - tileBlit.dst_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + tile_dest_area.x2 = width + dest_area->x1 - x * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tile_dest_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tile_dest_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; } - if(tileX < (totalTilesX - 1)) { - /* And adjust end coords if shifted, but not for last tile! */ - tileBlit.src_area.x2 += shiftSrcX; - tileBlit.dst_area.x2 += shiftDstX; + if(x < (total_tiles_x - 1)) { + /* And adjust end coords if shifted, but not for last tile! */ + tile_src_area.x2 += shift_src_x; + tile_dest_area.x2 += shift_dest_x; } - rv = _lv_gpu_nxp_vglite_blit_single(&tileBlit); + if(check_src_alignment(tile_src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); -#if BLIT_DBG_AREAS - lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.dst, tileBlit.dst_width, tileBlit.dst_height, &tileBlit.dst_area, - LV_COLOR_RED); - lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.src, tileBlit.src_width, tileBlit.src_height, &tileBlit.src_area, - LV_COLOR_GREEN); -#endif + /* Set new dest_vgbuf and src_vgbuf memory addresses. */ + lv_vglite_set_dest_buf_ptr(tile_dest_buf); + lv_vglite_set_src_buf_ptr(tile_src_buf); - PRINT_BLT("Tile [%d, %d]: " - "([%d,%d], [%d,%d]) -> " - "([%d,%d], [%d,%d]) | " - "([%dx%d] -> [%dx%d]) | " - "A:(0x%8X -> 0x%8X) %s\n", - tileX, tileY, - tileBlit.src_area.x1, tileBlit.src_area.y1, tileBlit.src_area.x2, tileBlit.src_area.y2, - tileBlit.dst_area.x1, tileBlit.dst_area.y1, tileBlit.dst_area.x2, tileBlit.dst_area.y2, - lv_area_get_width(&tileBlit.src_area), lv_area_get_height(&tileBlit.src_area), - lv_area_get_width(&tileBlit.dst_area), lv_area_get_height(&tileBlit.dst_area), - (uintptr_t) tileBlit.src, (uintptr_t) tileBlit.dst, - rv == LV_RES_OK ? "OK!" : "!!! FAILED !!!"); - - if(rv != LV_RES_OK) { /* if anything goes wrong... */ -#if LV_GPU_NXP_VG_LITE_LOG_ERRORS - LV_LOG_ERROR("Split blit failed. Trying SW blit instead."); -#endif - _sw_blit(&tileBlit); - rv = LV_RES_OK; /* Don't report error, as SW BLIT was performed */ - } + /* Set scissor */ + lv_vglite_set_scissor(&tile_dest_area); - } - PRINT_BLT(" \n"); - } + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(&tile_dest_area); - return rv; /* should never fail */ -} -#endif /* VG_LITE_BLIT_SPLIT_ENABLED */ + /* Start blit. */ + rv = lv_vglite_blit(&tile_src_area, opa); -static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - vg_lite_buffer_t src_vgbuf, dst_vgbuf; - vg_lite_error_t err = VG_LITE_SUCCESS; - uint32_t rect[4]; - vg_lite_float_t scale = 1.0; + /* Disable scissor. */ + lv_vglite_disable_scissor(); - if(blit == NULL) { - /*Wrong parameter*/ - return LV_RES_INV; - } + VG_LITE_LOG_TRACE("Tile [%d, %d] " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x) %s", + x, y, + tile_src_area.x1, tile_src_area.y1, tile_src_area.x2, tile_src_area.y2, + tile_dest_area.x1, tile_dest_area.y1, tile_dest_area.x2, tile_dest_area.y2, + lv_area_get_width(&tile_src_area), lv_area_get_height(&tile_src_area), + lv_area_get_width(&tile_dest_area), lv_area_get_height(&tile_dest_area), + (uintptr_t)tile_src_buf, (uintptr_t)tile_dest_buf, + rv == LV_RES_OK ? "OK!" : "FAILED!"); - if(blit->opa < (lv_opa_t) LV_OPA_MIN) { - return LV_RES_OK; /*Nothing to BLIT*/ + if(rv != LV_RES_OK) { + return rv; + } + } } - /*Wrap src/dst buffer into VG-Lite buffer*/ - if(lv_vglite_init_buf(&src_vgbuf, (uint32_t)blit->src_width, (uint32_t)blit->src_height, (uint32_t)blit->src_stride, - blit->src, true) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - - if(lv_vglite_init_buf(&dst_vgbuf, (uint32_t)blit->dst_width, (uint32_t)blit->dst_height, (uint32_t)blit->dst_stride, - blit->dst, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - - rect[0] = (uint32_t)blit->src_area.x1; /* start x */ - rect[1] = (uint32_t)blit->src_area.y1; /* start y */ - rect[2] = (uint32_t)blit->src_area.x2 - (uint32_t)blit->src_area.x1 + 1U; /* width */ - rect[3] = (uint32_t)blit->src_area.y2 - (uint32_t)blit->src_area.y1 + 1U; /* height */ - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - vg_lite_translate((vg_lite_float_t)blit->dst_area.x1, (vg_lite_float_t)blit->dst_area.y1, &matrix); - - if((blit->angle != 0) || (blit->zoom != LV_IMG_ZOOM_NONE)) { - vg_lite_translate(blit->pivot.x, blit->pivot.y, &matrix); - vg_lite_rotate(blit->angle / 10.0f, &matrix); /* angle is 1/10 degree */ - scale = 1.0f * blit->zoom / LV_IMG_ZOOM_NONE; - vg_lite_scale(scale, scale, &matrix); - vg_lite_translate(0.0f - blit->pivot.x, 0.0f - blit->pivot.y, &matrix); - } + return rv; +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); +static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + vg_lite_buffer_t * dst_vgbuf = lv_vglite_get_dest_buf(); + vg_lite_buffer_t * src_vgbuf = lv_vglite_get_src_buf(); + + uint32_t rect[] = { + (uint32_t)src_area->x1, /* start x */ + (uint32_t)src_area->y1, /* start y */ + (uint32_t)lv_area_get_width(src_area), /* width */ + (uint32_t)lv_area_get_height(src_area) /* height */ + }; uint32_t color; vg_lite_blend_t blend; - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { + if(opa >= (lv_opa_t)LV_OPA_MAX) { color = 0xFFFFFFFFU; blend = VG_LITE_BLEND_SRC_OVER; - src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; } else { - uint32_t opa = (uint32_t)blit->opa; if(vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { color = (opa << 24) | 0x00FFFFFFU; } @@ -498,94 +547,62 @@ static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * b color = (opa << 24) | (opa << 16) | (opa << 8) | opa; } blend = VG_LITE_BLEND_SRC_OVER; - src_vgbuf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; } - err = vg_lite_blit_rect(&dst_vgbuf, &src_vgbuf, rect, &matrix, blend, color, VG_LITE_FILTER_POINT); + err = vg_lite_blit_rect(dst_vgbuf, src_vgbuf, rect, &vgmatrix, blend, color, VG_LITE_FILTER_POINT); VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed."); - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); return LV_RES_OK; } -#if VG_LITE_BLIT_SPLIT_ENABLED - -static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit) +static lv_res_t check_src_alignment(const lv_color_t * src_buf, lv_coord_t src_stride) { - int x, y; - - lv_coord_t w = lv_area_get_width(&blit->src_area); - lv_coord_t h = lv_area_get_height(&blit->src_area); - - int32_t srcStridePx = blit->src_stride / (int32_t)sizeof(lv_color_t); - int32_t dstStridePx = blit->dst_stride / (int32_t)sizeof(lv_color_t); + /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */ - lv_color_t * src = (lv_color_t *)blit->src + blit->src_area.y1 * srcStridePx + blit->src_area.x1; - lv_color_t * dst = (lv_color_t *)blit->dst + blit->dst_area.y1 * dstStridePx + blit->dst_area.x1; + /* Test for pointer alignment */ + if((((uintptr_t)src_buf) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U) + VG_LITE_RETURN_INV("Src buffer ptr (0x%x) not aligned to 0x%x bytes.", + (size_t)src_buf, LV_ATTRIBUTE_MEM_ALIGN_SIZE); - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - /* simple copy */ - for(y = 0; y < h; y++) { - lv_memcpy(dst, src, (uint32_t)w * sizeof(lv_color_t)); - src += srcStridePx; - dst += dstStridePx; - } - } - else if(blit->opa >= LV_OPA_MIN) { - /* alpha blending */ - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dst[x] = lv_color_mix(src[x], dst[x], blit->opa); - } - src += srcStridePx; - dst += dstStridePx; - } - } + /* Test for stride alignment */ + if((src_stride % (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) != 0x0U) + VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.", + src_stride, LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + return LV_RES_OK; } -static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit) +static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area) { + vg_lite_identity(&vgmatrix); + vg_lite_translate((vg_lite_float_t)dest_area->x1, (vg_lite_float_t)dest_area->y1, &vgmatrix); +} - /* Test for minimal width */ - if(lv_area_get_width(&blit->src_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) - VG_LITE_RETURN_INV("Src area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->src_area), - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - /* Test for minimal width */ - if(lv_area_get_width(&blit->dst_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) - VG_LITE_RETURN_INV("Dest area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->dst_area), - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - /* Test for pointer alignment */ - if((((uintptr_t) blit->src) % LV_ATTRIBUTE_MEM_ALIGN_SIZE) != 0x0) - VG_LITE_RETURN_INV("Src buffer ptr (0x%X) not aligned to %d.", (size_t) blit->src, LV_ATTRIBUTE_MEM_ALIGN_SIZE); - - /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */ - - /* Test for stride alignment */ - if((blit->src_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0) - VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.", blit->src_stride, - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - /* Test for stride alignment */ - if((blit->dst_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0) - VG_LITE_RETURN_INV("Dest buffer stride (%d px) not aligned to %d px.", blit->dst_stride, - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); +static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc) +{ + lv_vglite_set_translation_matrix(dest_area); - if((lv_area_get_width(&blit->src_area) != lv_area_get_width(&blit->dst_area)) || - (lv_area_get_height(&blit->src_area) != lv_area_get_height(&blit->dst_area))) - VG_LITE_RETURN_INV("Src and dest buffer areas are not equal."); + bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE); + bool has_rotation = (dsc->angle != 0); - return LV_RES_OK; + vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &vgmatrix); + if(has_rotation) + vg_lite_rotate(dsc->angle / 10.0f, &vgmatrix); /* angle is 1/10 degree */ + if(has_scale) { + vg_lite_float_t scale = 1.0f * dsc->zoom / LV_IMG_ZOOM_NONE; + vg_lite_scale(scale, scale, &vgmatrix); + } + vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &vgmatrix); } -static void _align_x(lv_area_t * area, lv_color_t ** buf) +#if VG_LITE_BLIT_SPLIT_ENABLED +static void align_x(lv_area_t * area, lv_color_t ** buf) { - - int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE * 8 / LV_COLOR_DEPTH)); + int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE / sizeof(lv_color_t))); VG_LITE_COND_STOP(alignedAreaStartPx < 0, "Negative X alignment."); area->x1 -= alignedAreaStartPx; @@ -593,17 +610,17 @@ static void _align_x(lv_area_t * area, lv_color_t ** buf) *buf += alignedAreaStartPx; } -static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx) +static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride) { int LineToAlignMem; int alignedAreaStartPy; /* find how many lines of pixels will respect memory alignment requirement */ - if(stridePx % (uint32_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE == 0U) { + if((stride % (lv_coord_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) == 0x0U) { alignedAreaStartPy = area->y1; } else { - LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX), + LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)); + VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)), "Complex case: need gcd function."); alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem); VG_LITE_COND_STOP(alignedAreaStartPy < 0, "Negative Y alignment."); @@ -611,7 +628,7 @@ static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx) area->y1 -= alignedAreaStartPy; area->y2 -= alignedAreaStartPy; - *buf += (uint32_t)alignedAreaStartPy * stridePx; + *buf += (uint32_t)(alignedAreaStartPy * stride); } #endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h index bc448c6..1aae34b 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -41,64 +41,31 @@ extern "C" { #include "../../../lv_conf_internal.h" #if LV_USE_GPU_NXP_VG_LITE -#include "lv_gpu_nxp_vglite.h" +#include "lv_vglite_utils.h" /********************* * DEFINES *********************/ -#ifndef LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by VG-Lite with 100% opacity*/ -#define LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by VG-Lite with transparency*/ -#define LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with 100% opacity to be handled by VG-Lite*/ -#define LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT -/** Minimum invalidated area (in pixels) to be synchronized by VG-Lite during buffer sync */ -#define LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with transparency to be handled by VG-Lite*/ -#define LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT 5000 +/** + * Enable BLIT quality degradation workaround for RT595, + * recommended for screen's dimension > 352 pixels. + */ +#define RT595_BLIT_WRKRND_ENABLED 1 + +/* Internal compound symbol */ +#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ + defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ + RT595_BLIT_WRKRND_ENABLED +#define VG_LITE_BLIT_SPLIT_ENABLED 1 +#else +#define VG_LITE_BLIT_SPLIT_ENABLED 0 #endif /********************** * TYPEDEFS **********************/ -/** - * BLock Image Transfer descriptor structure - */ -typedef struct { - - const lv_color_t * src; /**< Source buffer pointer (must be aligned on 32 bytes)*/ - lv_area_t src_area; /**< Area to be copied from source*/ - lv_coord_t src_width; /**< Source buffer width*/ - lv_coord_t src_height; /**< Source buffer height*/ - int32_t src_stride; /**< Source buffer stride in bytes (must be aligned on 16 px)*/ - - const lv_color_t * dst; /**< Destination buffer pointer (must be aligned on 32 bytes)*/ - lv_area_t dst_area; /**< Target area in destination buffer (must be the same as src_area)*/ - lv_coord_t dst_width; /**< Destination buffer width*/ - lv_coord_t dst_height; /**< Destination buffer height*/ - int32_t dst_stride; /**< Destination buffer stride in bytes (must be aligned on 16 px)*/ - - lv_opa_t opa; /**< Opacity - alpha mix (0 = source not copied, 255 = 100% opaque)*/ - uint32_t angle; /**< Rotation angle (1/10 of degree)*/ - uint32_t zoom; /**< 256 = no zoom (1:1 scale ratio)*/ - lv_point_t pivot; /**< The coordinates of rotation pivot in source image buffer*/ -} lv_gpu_nxp_vglite_blit_info_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -106,35 +73,87 @@ typedef struct { /** * Fill area, with optional opacity. * - * @param[in/out] dest_buf Destination buffer pointer (must be aligned on 32 bytes) - * @param[in] dest_width Destination buffer width in pixels (must be aligned on 16 px) - * @param[in] dest_height Destination buffer height in pixels - * @param[in] fill_area Area to be filled - * @param[in] color Fill color + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] color Color * @param[in] opa Opacity (255 = full, 128 = 50% background/50% color, 0 = no fill) + * * @retval LV_RES_OK Fill completed * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa); +lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa); + +#if VG_LITE_BLIT_SPLIT_ENABLED +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); +#else +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. + * + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); /** - * BLock Image Transfer. + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. + * By default, image is copied directly, with optional opacity. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] clip_area Clip area with relative coordinates of destination buffer + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor * - * @param[in] blit Description of the transfer * @retval LV_RES_OK Transfer complete * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit); +lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc); + +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ /** - * BLock Image Transfer with transformation. + * BLock Image Transfer - simple copy of rectangular image from source to destination. + * + * @param[in] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels * - * @param[in] blit Description of the transfer * @retval LV_RES_OK Transfer complete * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit); +lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride); /********************** * MACROS diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c new file mode 100644 index 0000000..bf7bee1 --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c @@ -0,0 +1,142 @@ +/** + * @file lv_draw_vglite_line.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_line.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_buf.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, + const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + vg_lite_path_t path; + vg_lite_color_t vgcol; /* vglite takes ABGR */ + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); + vg_lite_cap_style_t cap_style = (dsc->round_start || dsc->round_end) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; + vg_lite_join_style_t join_style = (dsc->round_start || dsc->round_end) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; + + bool is_dashed = (dsc->dash_width && dsc->dash_gap); + + vg_lite_float_t stroke_dash_pattern[2] = {0, 0}; + uint32_t stroke_dash_count = 0; + vg_lite_float_t stroke_dash_phase = 0; + if(is_dashed) { + stroke_dash_pattern[0] = (vg_lite_float_t)dsc->dash_width; + stroke_dash_pattern[1] = (vg_lite_float_t)dsc->dash_gap; + stroke_dash_count = sizeof(stroke_dash_pattern) / sizeof(vg_lite_float_t); + stroke_dash_phase = (vg_lite_float_t)dsc->dash_width / 2; + } + + /* Choose vglite blend mode based on given lvgl blend mode */ + vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode); + + /*** Init path ***/ + lv_coord_t width = dsc->width; + + int32_t line_path[] = { /*VG line path*/ + VLC_OP_MOVE, point1->x, point1->y, + VLC_OP_LINE, point2->x, point2->y, + VLC_OP_END + }; + + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(line_path), line_path, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + lv_color32_t col32 = { .full = lv_color_to32(dsc->color) }; /*Convert color to RGBA8888*/ + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + /*** Draw line ***/ + err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH); + VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed."); + + err = vg_lite_set_stroke(&path, cap_style, join_style, width, 8, stroke_dash_pattern, stroke_dash_count, + stroke_dash_phase, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Set stroke failed."); + + err = vg_lite_update_stroke(&path); + VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); + + lv_vglite_set_scissor(clip_area); + + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw line failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.h b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.h new file mode 100644 index 0000000..cbd4b95 --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.h @@ -0,0 +1,83 @@ +/** + * @file lv_draw_vglite_line.h + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_LINE_H +#define LV_DRAW_VGLITE_LINE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_utils.h" +#include "../../lv_draw_line.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Draw line shape with effects + * + * @param[in] point1 Starting point with relative coordinates + * @param[in] point2 Ending point with relative coordinates + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Line description structure (width, rounded ending, opacity, ...) + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, + const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_RECT_H*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c index bc1d55c..e9db57d 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2021-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,11 +34,29 @@ #include "lv_draw_vglite_rect.h" #if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_buf.h" +#include +/********************* + * DEFINES + *********************/ /********************* * DEFINES *********************/ +/* Path data sizes for different elements */ +#define CUBIC_PATH_DATA_SIZE 7 /* 1 opcode, 6 arguments */ +#define LINE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ +#define MOVE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ +#define END_PATH_DATA_SIZE 1 /* 1 opcode, 0 arguments */ +/* Maximum possible rectangle path size + * is in the rounded rectangle case: + * - 1 move for the path start + * - 4 cubics for the corners + * - 4 lines for the sides + * - 1 end for the path end */ +#define RECT_PATH_DATA_MAX_SIZE 1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE + /********************** * TYPEDEFS **********************/ @@ -47,6 +65,18 @@ * STATIC PROTOTYPES **********************/ +/** + * Generates path data for rectangle drawing. + * + * @param[in/out] path The path data to initialize + * @param[in/out] path_size The resulting size of the created path data + * @param[in] dsc The style descriptor for the rectangle to be drawn + * @param[in] coords The coordinates of the rectangle to be drawn + */ +static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, + lv_coord_t radius, + const lv_area_t * coords); + /********************** * STATIC VARIABLES **********************/ @@ -59,94 +89,37 @@ * GLOBAL FUNCTIONS **********************/ -lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc) { - vg_lite_buffer_t vgbuf; vg_lite_error_t err = VG_LITE_SUCCESS; - lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); - lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); - vg_lite_path_t path; - vg_lite_color_t vgcol; /* vglite takes ABGR */ - vg_lite_matrix_t matrix; lv_coord_t width = lv_area_get_width(coords); lv_coord_t height = lv_area_get_height(coords); - vg_lite_linear_gradient_t gradient; - vg_lite_matrix_t * grad_matrix; + vg_lite_color_t vgcol; + lv_coord_t radius = dsc->radius; + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); if(dsc->radius < 0) return LV_RES_INV; - /* Make areas relative to draw buffer */ - lv_area_t rel_coords; - lv_area_copy(&rel_coords, coords); - lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - lv_area_t rel_clip; - lv_area_copy(&rel_clip, draw_ctx->clip_area); - lv_area_move(&rel_clip, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - /*** Init destination buffer ***/ - if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), - (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - /*** Init path ***/ - int32_t rad = dsc->radius; - if(dsc->radius == LV_RADIUS_CIRCLE) { - rad = (width > height) ? height / 2 : width / 2; - } - - if((dsc->radius == LV_RADIUS_CIRCLE) && (width == height)) { - float tang = ((float)rad * BEZIER_OPTIM_CIRCLE); - int32_t cpoff = (int32_t)tang; - int32_t circle_path[] = { /*VG circle path*/ - VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1, - VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */ - VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */ - VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */ - VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */ - VLC_OP_END - }; - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(circle_path), circle_path, - (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, - ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); - } - else if(dsc->radius > 0) { - float tang = ((float)rad * BEZIER_OPTIM_CIRCLE); - int32_t cpoff = (int32_t)tang; - int32_t rounded_path[] = { /*VG rounded rectangular path*/ - VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1, - VLC_OP_LINE, rel_coords.x2 - rad + 1, rel_coords.y1, /* top */ - VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */ - VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 - rad + 1, /* right */ - VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */ - VLC_OP_LINE, rel_coords.x1 + rad, rel_coords.y2 + 1, /* bottom */ - VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */ - VLC_OP_LINE, rel_coords.x1, rel_coords.y1 + rad, /* left */ - VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */ - VLC_OP_END - }; - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(rounded_path), rounded_path, - (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, - ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); - } - else { - int32_t rect_path[] = { /*VG rectangular path*/ - VLC_OP_MOVE, rel_coords.x1, rel_coords.y1, - VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y1, - VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 + 1, - VLC_OP_LINE, rel_coords.x1, rel_coords.y2 + 1, - VLC_OP_LINE, rel_coords.x1, rel_coords.y1, - VLC_OP_END - }; - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(rect_path), rect_path, - (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, - ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); - } + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + lv_vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); + vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_LOW; + vg_lite_path_t path; + err = vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; vg_lite_identity(&matrix); + vg_lite_matrix_t * grad_matrix; + vg_lite_linear_gradient_t gradient; + /*** Init Color/Gradient ***/ if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { uint32_t colors[2]; @@ -154,18 +127,14 @@ lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_ lv_color32_t col32[2]; /* Gradient setup */ - uint8_t cnt = MAX(dsc->bg_grad.stops_count, 2); + uint8_t cnt = LV_MAX(dsc->bg_grad.stops_count, 2); for(uint8_t i = 0; i < cnt; i++) { col32[i].full = lv_color_to32(dsc->bg_grad.stops[i].color); /*Convert color to RGBA8888*/ stops[i] = dsc->bg_grad.stops[i].frac; -#if LV_COLOR_DEPTH==16 - colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.blue << 16) | - ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.red; -#else /*LV_COLOR_DEPTH==32*/ - /* watchout: red and blue color components are inverted versus vg_lite_color_t order */ - colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.red << 16) | - ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.blue; -#endif + + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_ABGR8888 : VG_LITE_ARGB8888; + if(lv_vglite_premult_and_swizzle(&colors[i], col32[i], dsc->bg_opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); } lv_memset_00(&gradient, sizeof(vg_lite_linear_gradient_t)); @@ -181,7 +150,7 @@ lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_ grad_matrix = vg_lite_get_grad_matrix(&gradient); vg_lite_identity(grad_matrix); - vg_lite_translate((float)rel_coords.x1, (float)rel_coords.y1, grad_matrix); + vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix); if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); @@ -192,39 +161,26 @@ lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_ } } - lv_opa_t bg_opa = dsc->bg_opa; lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; /*Convert color to RGBA8888*/ - if(bg_opa <= (lv_opa_t)LV_OPA_MAX) { - /* Only pre-multiply color if hardware pre-multiplication is not present */ - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - bg_col32.ch.red = (uint8_t)(((uint16_t)bg_col32.ch.red * bg_opa) >> 8); - bg_col32.ch.green = (uint8_t)(((uint16_t)bg_col32.ch.green * bg_opa) >> 8); - bg_col32.ch.blue = (uint8_t)(((uint16_t)bg_col32.ch.blue * bg_opa) >> 8); - } - bg_col32.ch.alpha = bg_opa; - } + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, bg_col32, dsc->bg_opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); -#if LV_COLOR_DEPTH==16 - vgcol = bg_col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)bg_col32.ch.alpha << 24) | ((uint32_t)bg_col32.ch.blue << 16) | - ((uint32_t)bg_col32.ch.green << 8) | (uint32_t)bg_col32.ch.red; -#endif - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); + lv_vglite_set_scissor(clip_area); /*** Draw rectangle ***/ if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { - err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); } else { - err = vg_lite_draw_gradient(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER); + err = vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER); } VG_LITE_ERR_RETURN_INV(err, "Draw gradient failed."); - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); @@ -237,8 +193,267 @@ lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_ return LV_RES_OK; } +lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc, bool border) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + vg_lite_color_t vgcol; /* vglite takes ABGR */ + lv_coord_t radius = dsc->radius; + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); + + if(radius < 0) + return LV_RES_INV; + + if(border) { + /* Draw border - only has radius if object has radius*/ + lv_coord_t border_half = (lv_coord_t)floor(dsc->border_width / 2.0f); + if(radius > border_half) + radius = radius - border_half; + } + else { + /* Draw outline - always has radius, leave the same radius in the circle case */ + lv_coord_t outline_half = (lv_coord_t)ceil(dsc->outline_width / 2.0f); + if(radius < (lv_coord_t)LV_RADIUS_CIRCLE - outline_half) + radius = radius + outline_half; + } + + vg_lite_cap_style_t cap_style = (radius) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; + vg_lite_join_style_t join_style = (radius) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; + + /* Choose vglite blend mode based on given lvgl blend mode */ + vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode); + + /*** Init path ***/ + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + lv_vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); + vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_LOW; + + vg_lite_path_t path; + err = vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + lv_opa_t opa; + lv_color32_t col32; + lv_coord_t line_width; + + if(border) { + opa = dsc->border_opa; + col32.full = lv_color_to32(dsc->border_color); /*Convert color to RGBA8888*/ + line_width = dsc->border_width; + } + else { + opa = dsc->outline_opa; + col32.full = lv_color_to32(dsc->outline_color); /*Convert color to RGBA8888*/ + line_width = dsc->outline_width; + } + + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + /*** Draw border ***/ + err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH); + VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed."); + + err = vg_lite_set_stroke(&path, cap_style, join_style, line_width, 8, NULL, 0, 0, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Set stroke failed."); + + err = vg_lite_update_stroke(&path); + VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); + + lv_vglite_set_scissor(clip_area); + + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw border failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + return LV_RES_OK; + +} + /********************** * STATIC FUNCTIONS **********************/ +static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, + lv_coord_t radius, + const lv_area_t * coords) +{ + lv_coord_t rect_width = lv_area_get_width(coords); + lv_coord_t rect_height = lv_area_get_height(coords); + + /* Get the final radius. Can't be larger than the half of the shortest side */ + int32_t shortest_side = LV_MIN(rect_width, rect_height); + int32_t final_radius = LV_MIN(radius, shortest_side / 2); + + /* Path data element index */ + uint8_t pidx = 0; + + if((radius == (lv_coord_t)LV_RADIUS_CIRCLE) && (rect_width == rect_height)) { + + /* Get the control point offset for rounded cases */ + int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); + + /* Circle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y1; + + /* Top-right arc */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius; + + /* Bottom-right arc*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = cpoff; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + + /* Bottom-left arc */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Top-left arc*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + else if(radius > 0) { + /* Get the control point offset for rounded cases */ + int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); + + /* Rounded rectangle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y1; + + /* Top side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 - final_radius + 1; // Extended for VGLite + path_data[pidx++] = coords->y1; + + /* Top-right corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius; + + /* Right side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; // Extended for VGLite + path_data[pidx++] = coords->y2 - final_radius + 1; // Extended for VGLite + + /* Bottom-right corner*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = cpoff; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + + /* Bottom side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y2 + 1; // Extended for VGLite + + /* Bottom-left corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Left side*/ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1 + final_radius; + + /* Top-left corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + else { + /* Non-rounded rectangle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1; + + /* Top side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; // Extended for VGLite + path_data[pidx++] = coords->y1; + + /* Right side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; // Extended for VGLite + path_data[pidx++] = coords->y2 + 1; // Extended for VGLite + + /* Bottom side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y2 + 1; // Extended for VGLite + + /* Left side*/ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + + /* Resulting path size */ + *path_data_size = pidx * sizeof(int32_t); +} + #endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h index d708e7b..7958227 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h +++ b/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2021-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -40,7 +40,7 @@ extern "C" { #include "../../../lv_conf_internal.h" #if LV_USE_GPU_NXP_VG_LITE -#include "lv_gpu_nxp_vglite.h" +#include "lv_vglite_utils.h" #include "../../lv_draw_rect.h" /********************* @@ -56,13 +56,33 @@ extern "C" { **********************/ /** - * Draw rectangle shape with effects (rounded corners, gradient) + * Draw rectangle background with effects (rounded corners, gradient) + * + * @param[in] coords Coordinates of the rectangle background (relative to dest buff) + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Description of the rectangle background + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + * + */ +lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc); + +/** + * Draw rectangle border/outline shape with effects (rounded corners, opacity) + * + * @param[in] coords Coordinates of the rectangle border/outline (relative to dest buff) + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Description of the rectangle border/outline + * @param[in] border True for border, False for outline + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) * - * @param draw_ctx drawing context - * @param dsc description of the rectangle - * @param coords the area where rectangle is clipped */ -lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); +lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc, bool border); /********************** * MACROS diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c b/lib/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c deleted file mode 100644 index f65ec1d..0000000 --- a/lib/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @file lv_gpu_nxp_vglite.c - * - */ - -/** - * MIT License - * - * Copyright 2020-2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_gpu_nxp_vglite.h" - -#if LV_USE_GPU_NXP_VG_LITE -#include "../../../core/lv_refr.h" -#if BLIT_DBG_AREAS - #include "lv_draw_vglite_blend.h" -#endif - -/********************* - * DEFINES - *********************/ - -#if LV_COLOR_DEPTH==16 - #define VG_LITE_PX_FMT VG_LITE_RGB565 -#elif LV_COLOR_DEPTH==32 - #define VG_LITE_PX_FMT VG_LITE_BGRA8888 -#else - #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride, - const lv_color_t * ptr, bool source) -{ - /*Test for memory alignment*/ - if((((uintptr_t)ptr) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U) - VG_LITE_RETURN_INV("%s buffer (0x%x) not aligned to %d.", source ? "Src" : "Dest", - (size_t) ptr, LV_ATTRIBUTE_MEM_ALIGN_SIZE); - - /*Test for stride alignment*/ - if(source && (stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t))) != 0x0U) - VG_LITE_RETURN_INV("Src buffer stride (%d bytes) not aligned to %d bytes.", stride, - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)); - - vgbuf->format = VG_LITE_PX_FMT; - vgbuf->tiled = VG_LITE_LINEAR; - vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; - vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; - - vgbuf->width = (int32_t)width; - vgbuf->height = (int32_t)height; - vgbuf->stride = (int32_t)stride; - - lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv)); - - vgbuf->memory = (void *)ptr; - vgbuf->address = (uint32_t)vgbuf->memory; - vgbuf->handle = NULL; - - return LV_RES_OK; -} - -#if BLIT_DBG_AREAS -void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - lv_area_t * fill_area, lv_color_t color) -{ - lv_area_t a; - - /* top line */ - a.x1 = fill_area->x1; - a.x2 = fill_area->x2; - a.y1 = fill_area->y1; - a.y2 = fill_area->y1; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); - - - /* bottom line */ - a.x1 = fill_area->x1; - a.x2 = fill_area->x2; - a.y1 = fill_area->y2; - a.y2 = fill_area->y2; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); - - /* left line */ - a.x1 = fill_area->x1; - a.x2 = fill_area->x1; - a.y1 = fill_area->y1; - a.y2 = fill_area->y2; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); - - /* right line */ - a.x1 = fill_area->x2; - a.x2 = fill_area->x2; - a.y1 = fill_area->y1; - a.y2 = fill_area->y2; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); -} -#endif /* BLIT_DBG_AREAS */ - -void lv_vglite_invalidate_cache(void) -{ - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - if(disp->driver->clean_dcache_cb) - disp->driver->clean_dcache_cb(disp->driver); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c new file mode 100644 index 0000000..e1ff6a2 --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c @@ -0,0 +1,141 @@ +/** + * @file lv_vglite_buf.c + * + */ + +/** + * MIT License + * + * Copyright 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_buf.h" + +#if LV_USE_GPU_NXP_VG_LITE + +/********************* + * DEFINES + *********************/ + +#if LV_COLOR_DEPTH == 16 + #define VG_LITE_PX_FMT VG_LITE_RGB565 +#elif LV_COLOR_DEPTH == 32 + #define VG_LITE_PX_FMT VG_LITE_BGRA8888 +#else + #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); +static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf); + +/********************** + * STATIC VARIABLES + **********************/ + +static vg_lite_buffer_t dest_vgbuf; +static vg_lite_buffer_t src_vgbuf; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gpu_nxp_vglite_init_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + lv_vglite_set_dest_buf(buf, area, stride); +} + +vg_lite_buffer_t * lv_vglite_get_dest_buf(void) +{ + return &dest_vgbuf; +} + +vg_lite_buffer_t * lv_vglite_get_src_buf(void) +{ + return &src_vgbuf; +} + +void lv_vglite_set_dest_buf_ptr(const lv_color_t * buf) +{ + lv_vglite_set_buf_ptr(&dest_vgbuf, buf); +} + +void lv_vglite_set_src_buf_ptr(const lv_color_t * buf) +{ + lv_vglite_set_buf_ptr(&src_vgbuf, buf); +} + +void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + if(src_vgbuf.memory != (void *)buf) + lv_vglite_set_buf(&src_vgbuf, buf, area, stride); +} + +void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, + const lv_area_t * area, lv_coord_t stride) +{ + vgbuf->format = VG_LITE_PX_FMT; + vgbuf->tiled = VG_LITE_LINEAR; + vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; + vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; + + vgbuf->width = (int32_t)lv_area_get_width(area); + vgbuf->height = (int32_t)lv_area_get_height(area); + vgbuf->stride = (int32_t)(stride) * sizeof(lv_color_t); + + lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv)); + + vgbuf->memory = (void *)buf; + vgbuf->address = (uint32_t)vgbuf->memory; + vgbuf->handle = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + lv_vglite_set_buf(&dest_vgbuf, buf, area, stride); +} + +static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf) +{ + vgbuf->memory = (void *)buf; + vgbuf->address = (uint32_t)vgbuf->memory; +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h new file mode 100644 index 0000000..e89af1c --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h @@ -0,0 +1,124 @@ +/** + * @file lv_vglite_buf.h + * + */ + +/** + * MIT License + * + * Copyright 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_VGLITE_BUF_H +#define LV_VGLITE_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "vg_lite.h" +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +/** + * Init vglite destination buffer. It will be done once per frame. + * + * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode) + * @param[in] area Destination buffer area (for width and height) + * @param[in] stride Stride of destination buffer + */ +void lv_gpu_nxp_vglite_init_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); + +/** + * Get vglite destination buffer pointer. + * + * @retval The vglite destination buffer + */ +vg_lite_buffer_t * lv_vglite_get_dest_buf(void); + +/** + * Get vglite source buffer pointer. + * + * @retval The vglite source buffer + */ +vg_lite_buffer_t * lv_vglite_get_src_buf(void); + +/** + * Set vglite destination buffer address only. + * + * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode) + */ +void lv_vglite_set_dest_buf_ptr(const lv_color_t * buf); + +/** + * Set vglite source buffer address only. + * + * @param[in] buf Source buffer address + */ +void lv_vglite_set_src_buf_ptr(const lv_color_t * buf); + +/** + * Set vglite source buffer. It will be done only if buffer addreess is different. + * + * @param[in] buf Source buffer address + * @param[in] area Source buffer area (for width and height) + * @param[in] stride Stride of source buffer + */ +void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); + +/** + * Set vglite buffer. + * + * @param[in] vgbuf Address of the VGLite buffer object + * @param[in] buf Address of the memory for the VGLite buffer + * @param[in] area buffer area (for width and height) + * @param[in] stride buffer stride + */ +void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, + const lv_area_t * area, lv_coord_t stride); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VGLITE_BUF_H*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c new file mode 100644 index 0000000..adc9f77 --- /dev/null +++ b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c @@ -0,0 +1,149 @@ +/** + * @file lv_vglite_utils.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_utils.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "../../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Clean and invalidate cache. + */ +static inline void invalidate_cache(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_vglite_run(void) +{ + invalidate_cache(); + + VG_LITE_ERR_RETURN_INV(vg_lite_flush(), "Flush failed."); + + return LV_RES_OK; +} + +lv_res_t lv_vglite_premult_and_swizzle(vg_lite_color_t * vg_col32, lv_color32_t lv_col32, lv_opa_t opa, + vg_lite_buffer_format_t vg_col_format) +{ + + lv_color32_t lv_col32_premul = lv_col32; + if(opa <= (lv_opa_t)LV_OPA_MAX) { + /* Only pre-multiply color if hardware pre-multiplication is not present */ + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + lv_col32_premul.ch.red = (uint8_t)(((uint16_t)lv_col32.ch.red * opa) >> 8); + lv_col32_premul.ch.green = (uint8_t)(((uint16_t)lv_col32.ch.green * opa) >> 8); + lv_col32_premul.ch.blue = (uint8_t)(((uint16_t)lv_col32.ch.blue * opa) >> 8); + } + lv_col32_premul.ch.alpha = opa; + } + + switch(vg_col_format) { + case VG_LITE_BGRA8888: + *vg_col32 = lv_col32_premul.full; + break; + case VG_LITE_RGBA8888: + *vg_col32 = ((uint32_t)lv_col32_premul.ch.red << 24) | ((uint32_t)lv_col32_premul.ch.green << 16) | + ((uint32_t)lv_col32_premul.ch.blue << 8) | (uint32_t)lv_col32_premul.ch.alpha; + break; + case VG_LITE_ABGR8888: + *vg_col32 = ((uint32_t)lv_col32_premul.ch.alpha << 24) | ((uint32_t)lv_col32_premul.ch.blue << 16) | + ((uint32_t)lv_col32_premul.ch.green << 8) | (uint32_t)lv_col32_premul.ch.red; + break; + case VG_LITE_ARGB8888: + *vg_col32 = ((uint32_t)lv_col32_premul.ch.alpha << 24) | ((uint32_t)lv_col32_premul.ch.red << 16) | + ((uint32_t)lv_col32_premul.ch.green << 8) | (uint32_t)lv_col32_premul.ch.blue; + break; + default: + return LV_RES_INV; + } + + return LV_RES_OK; +} + +vg_lite_blend_t lv_vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode) +{ + vg_lite_blend_t vg_blend_mode; + switch(lv_blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + vg_blend_mode = VG_LITE_BLEND_ADDITIVE; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + vg_blend_mode = VG_LITE_BLEND_SUBTRACT; + break; + case LV_BLEND_MODE_MULTIPLY: + vg_blend_mode = VG_LITE_BLEND_MULTIPLY; + break; + case LV_BLEND_MODE_REPLACE: + vg_blend_mode = VG_LITE_BLEND_NONE; + break; + default: + vg_blend_mode = VG_LITE_BLEND_SRC_OVER; + break; + } + return vg_blend_mode; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) + disp->driver->clean_dcache_cb(disp->driver); +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h similarity index 64% rename from lib/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h rename to lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h index c22cae1..219396b 100644 --- a/lib/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h +++ b/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h @@ -1,12 +1,12 @@ /** - * @file lv_gpu_nxp_vglite.h + * @file lv_vglite_utils.h * */ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,8 +27,8 @@ * */ -#ifndef LV_GPU_NXP_VGLITE_H -#define LV_GPU_NXP_VGLITE_H +#ifndef LV_VGLITE_UTILS_H +#define LV_VGLITE_UTILS_H #ifdef __cplusplus extern "C" { @@ -43,40 +43,21 @@ extern "C" { #include "vg_lite.h" #include "../../sw/lv_draw_sw.h" #include "../../../misc/lv_log.h" -#include "fsl_debug_console.h" /********************* * DEFINES *********************/ -/** Use this symbol as limit to disable feature (value has to be larger than supported resolution) */ -#define LV_GPU_NXP_VG_LITE_FEATURE_DISABLED (1920*1080+1) - -/** Stride in px required by VG-Lite HW. Don't change this. */ -#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U - #ifndef LV_GPU_NXP_VG_LITE_LOG_ERRORS /** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/ #define LV_GPU_NXP_VG_LITE_LOG_ERRORS 1 #endif #ifndef LV_GPU_NXP_VG_LITE_LOG_TRACES -/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/ +/** Enable logging of VG-Lite traces (\see LV_LOG_ERROR)*/ #define LV_GPU_NXP_VG_LITE_LOG_TRACES 0 #endif -/* Draw rectangles around BLIT tiles */ -#define BLIT_DBG_AREAS 0 - -/* Print detailed info to SDK console (NOT to LVGL log system) */ -#define BLIT_DBG_VERBOSE 0 - -/* Verbose debug print */ -#if BLIT_DBG_VERBOSE -#define PRINT_BLT PRINTF -#else -#define PRINT_BLT(...) -#endif /* The optimal Bezier control point offset for radial unit * see: https://spencermortensen.com/articles/bezier-circle/ @@ -90,41 +71,57 @@ extern "C" { * TYPEDEFS **********************/ +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Enable scissor and set the clipping box. + * + * @param[in] clip_area Clip area with relative coordinates of destination buffer + */ +static inline void lv_vglite_set_scissor(const lv_area_t * clip_area); + +/** + * Disable scissor. + */ +static inline void lv_vglite_disable_scissor(void); + + /********************** * GLOBAL PROTOTYPES **********************/ /** - * Fills vg_lite_buffer_t structure according given parameters. + * Premultiplies and swizzles given LVGL 32bit color to obtain vglite color. * - * @param[in/out] vgbuf Buffer structure to be filled - * @param[in] width Width of buffer in pixels - * @param[in] height Height of buffer in pixels - * @param[in] stride Stride of the buffer in bytes - * @param[in] ptr Pointer to the buffer (must be aligned according VG-Lite requirements) - * @param[in] source Boolean to check if this is a source buffer + * @param[in/out] vg_col32 The obtained vglite color + * @param[in] lv_col32 The initial LVGL 32bit color + * @param[in] opa The opacity to premultiply with + * @param[in] vg_col_format The format of the resulting vglite color + * + * @retval LV_RES_OK Operation completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride, - const lv_color_t * ptr, bool source); +lv_res_t lv_vglite_premult_and_swizzle(vg_lite_color_t * vg_col32, lv_color32_t lv_col32, lv_opa_t opa, + vg_lite_buffer_format_t vg_col_format); -#if BLIT_DBG_AREAS /** - * Draw a simple rectangle, 1 px line width. + * Get vglite blend mode. + * + * @param[in] lv_blend_mode The LVGL blend mode * - * @param dest_buf Destination buffer - * @param dest_width Destination buffer width (must be aligned on 16px) - * @param dest_height Destination buffer height - * @param fill_area Rectangle coordinates - * @param color Rectangle color + * @retval The vglite blend mode */ -void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - lv_area_t * fill_area, lv_color_t color); -#endif +vg_lite_blend_t lv_vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode); /** - * Clean & invalidate cache. + * Clear cache and flush command to VG-Lite. + * + * @retval LV_RES_OK Run completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -void lv_vglite_invalidate_cache(void); +lv_res_t lv_vglite_run(void); /********************** * MACROS @@ -142,7 +139,8 @@ void lv_vglite_invalidate_cache(void); #define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \ do { \ if(err != VG_LITE_SUCCESS) { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG_ERROR(fmt" (err = %d)", \ + err, ##__VA_ARGS__); \ return LV_RES_INV; \ } \ } while (0) @@ -158,7 +156,7 @@ void lv_vglite_invalidate_cache(void); #if LV_GPU_NXP_VG_LITE_LOG_TRACES #define VG_LITE_LOG_TRACE(fmt, ...) \ do { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG(fmt, ##__VA_ARGS__); \ } while (0) #define VG_LITE_RETURN_INV(fmt, ...) \ @@ -176,10 +174,27 @@ void lv_vglite_invalidate_cache(void); }while(0) #endif /*LV_GPU_NXP_VG_LITE_LOG_TRACES*/ +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vglite_set_scissor(const lv_area_t * clip_area) +{ + vg_lite_enable_scissor(); + vg_lite_set_scissor((int32_t)clip_area->x1, (int32_t)clip_area->y1, + (int32_t)lv_area_get_width(clip_area), + (int32_t)lv_area_get_height(clip_area)); +} + +static inline void lv_vglite_disable_scissor(void) +{ + vg_lite_disable_scissor(); +} + #endif /*LV_USE_GPU_NXP_VG_LITE*/ #ifdef __cplusplus } /*extern "C"*/ #endif -#endif /*LV_GPU_NXP_VGLITE_H*/ +#endif /*LV_VGLITE_UTILS_H*/ diff --git a/lib/lvgl/src/draw/renesas/lv_draw_renesas.mk b/lib/lvgl/src/draw/renesas/lv_draw_renesas.mk new file mode 100644 index 0000000..b5e3ad1 --- /dev/null +++ b/lib/lvgl/src/draw/renesas/lv_draw_renesas.mk @@ -0,0 +1,7 @@ +CSRCS += lv_gpu_d2_ra6m3.c +CSRCS += lv_gpu_d2_draw_label.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas" diff --git a/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c b/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c new file mode 100644 index 0000000..e92ebf1 --- /dev/null +++ b/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c @@ -0,0 +1,292 @@ +/** + * @file lv_gpu_d2_draw_label.c + * + * @description HAL layer for display driver + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_draw_label.h" +#include "../../misc/lv_assert.h" +#include "../../core/lv_refr.h" +#include "lv_gpu_d2_ra6m3.h" + +#if LV_USE_GPU_RA6M3_G2D +#include LV_GPU_RA6M3_G2D_INCLUDE + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +extern const uint8_t _lv_bpp1_opa_table[2]; +extern const uint8_t _lv_bpp2_opa_table[4]; +extern const uint8_t _lv_bpp4_opa_table[16]; +extern const uint8_t _lv_bpp8_opa_table[256]; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) +{ + + const uint8_t * bpp_opa_table_p; + uint32_t bitmask_init; + uint32_t bitmask; + uint32_t bpp = g->bpp; + lv_opa_t opa = dsc->opa; + uint32_t shades; + if(bpp == 3) bpp = 4; + +#if LV_USE_IMGFONT + if(bpp == LV_IMGFONT_BPP) { //is imgfont + lv_area_t fill_area; + fill_area.x1 = pos->x; + fill_area.y1 = pos->y; + fill_area.x2 = pos->x + g->box_w - 1; + fill_area.y2 = pos->y + g->box_h - 1; + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_IMG_ZOOM_NONE; + img_dsc.opa = dsc->opa; + img_dsc.blend_mode = dsc->blend_mode; + lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p); + return; + } +#endif + + switch(bpp) { + case 1: + bpp_opa_table_p = _lv_bpp1_opa_table; + bitmask_init = 0x80; + shades = 2; + break; + case 2: + bpp_opa_table_p = _lv_bpp2_opa_table; + bitmask_init = 0xC0; + shades = 4; + break; + case 4: + bpp_opa_table_p = _lv_bpp4_opa_table; + bitmask_init = 0xF0; + shades = 16; + break; + case 8: + bpp_opa_table_p = _lv_bpp8_opa_table; + bitmask_init = 0xFF; + shades = 256; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp"); + return; /*Invalid bpp. Can't render the letter*/ + } + + static lv_opa_t opa_table[256]; + static lv_opa_t prev_opa = LV_OPA_TRANSP; + static uint32_t prev_bpp = 0; + if(opa < LV_OPA_MAX) { + if(prev_opa != opa || prev_bpp != bpp) { + uint32_t i; + for(i = 0; i < shades; i++) { + opa_table[i] = bpp_opa_table_p[i] == LV_OPA_COVER ? opa : ((bpp_opa_table_p[i] * opa) >> 8); + } + } + bpp_opa_table_p = opa_table; + prev_opa = opa; + prev_bpp = bpp; + } + + int32_t col, row; + int32_t box_w = g->box_w; + int32_t box_h = g->box_h; + int32_t width_bit = box_w * bpp; /*Letter width in bits*/ + + /*Calculate the col/row start/end on the map*/ + int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : draw_ctx->clip_area->x1 - pos->x; + int32_t col_end = pos->x + box_w <= draw_ctx->clip_area->x2 ? box_w : draw_ctx->clip_area->x2 - pos->x + 1; + int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y; + int32_t row_end = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1; + + /*Move on the map too*/ + uint32_t bit_ofs = (row_start * width_bit) + (col_start * bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + uint32_t col_bit; + col_bit = bit_ofs & 0x7; /*"& 0x7" equals to "% 8" just faster*/ + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = dsc->color; + blend_dsc.opa = LV_OPA_COVER; + blend_dsc.blend_mode = dsc->blend_mode; + + lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + blend_dsc.mask_buf = mask_buf; + int32_t mask_p = 0; + + lv_area_t fill_area; + fill_area.x1 = col_start + pos->x; + fill_area.x2 = col_end + pos->x - 1; + fill_area.y1 = row_start + pos->y; + fill_area.y2 = fill_area.y1; +#if LV_DRAW_COMPLEX + lv_coord_t fill_w = lv_area_get_width(&fill_area); + lv_area_t mask_area; + lv_area_copy(&mask_area, &fill_area); + mask_area.y2 = mask_area.y1 + row_end; + bool mask_any = lv_draw_mask_is_any(&mask_area); +#endif + blend_dsc.blend_area = &fill_area; + blend_dsc.mask_area = &fill_area; + + uint32_t col_bit_max = 8 - bpp; + uint32_t col_bit_row_ofs = (box_w + col_start - col_end) * bpp; + + for(row = row_start ; row < row_end; row++) { +#if LV_DRAW_COMPLEX + int32_t mask_p_start = mask_p; +#endif + bitmask = bitmask_init >> col_bit; + for(col = col_start; col < col_end; col++) { + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (col_bit_max - col_bit); + if(letter_px) { + mask_buf[mask_p] = bpp_opa_table_p[letter_px]; + } + else { + mask_buf[mask_p] = 0; + } + + /*Go to the next column*/ + if(col_bit < col_bit_max) { + col_bit += bpp; + bitmask = bitmask >> bpp; + } + else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + + /*Next mask byte*/ + mask_p++; + } + +#if LV_DRAW_COMPLEX + /*Apply masks if any*/ + if(mask_any) { + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, fill_area.x1, fill_area.y2, + fill_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf + mask_p_start, fill_w); + } + } +#endif + + if((uint32_t) mask_p + (col_end - col_start) < mask_buf_size) { + fill_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc); + + fill_area.y1 = fill_area.y2 + 1; + fill_area.y2 = fill_area.y1; + mask_p = 0; + } + + col_bit += col_bit_row_ofs; + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + } + + /*Flush the last part*/ + if(fill_area.y1 != fill_area.y2) { + fill_area.y2--; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc); + mask_p = 0; + } + + lv_mem_buf_release(mask_buf); +} + +void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + const lv_font_t * font_p = dsc->font; + + lv_opa_t opa = dsc->opa; + if(opa < LV_OPA_MIN) return; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + if(font_p == NULL) { + LV_LOG_WARN("lv_draw_letter: font is NULL"); + return; + } + + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found + *but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20 && + letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ + letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", letter); + } + return; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) return; + + lv_point_t gpos; + gpos.x = pos_p->x + g.ofs_x; + gpos.y = pos_p->y + (dsc->font->line_height - dsc->font->base_line) - g.box_h - g.ofs_y; + + /*If the letter is completely out of mask don't draw it*/ + if(gpos.x + g.box_w < draw_ctx->clip_area->x1 || + gpos.x > draw_ctx->clip_area->x2 || + gpos.y + g.box_h < draw_ctx->clip_area->y1 || + gpos.y > draw_ctx->clip_area->y2) { + return; + } + + const uint8_t * map_p = lv_font_get_glyph_bitmap(font_p, letter); + if(map_p == NULL) { + LV_LOG_WARN("lv_draw_letter: character's bitmap not found"); + return; + } + + if(font_p->subpx) { +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX + draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa, blend_mode); +#else + LV_LOG_WARN("Can't draw sub-pixel rendered letter because LV_USE_FONT_SUBPX == 0 in lv_conf.h"); +#endif + } + else { + draw_letter_normal(draw_ctx, dsc, &gpos, &g, map_p); + } +} + +#endif diff --git a/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c b/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c new file mode 100644 index 0000000..ba4c084 --- /dev/null +++ b/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c @@ -0,0 +1,742 @@ +/** + * @file lv_gpu_d2_ra6m3.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gpu_d2_ra6m3.h" +#include "../../core/lv_refr.h" +#include + +#if LV_USE_GPU_RA6M3_G2D + +#include LV_GPU_RA6M3_G2D_INCLUDE + +/********************* + * DEFINES + *********************/ +#define LOG_ERRORS +#ifdef LOG_ERRORS + #define STRINGIFY(x) #x + #define TOSTRING(x) STRINGIFY(x) + + #define ERROR_LIST_SIZE (4) + #define D2_EXEC(a) lv_port_gpu_log_error(a, __func__, __LINE__) +#else + /* here is error logging not enabled */ + #define D2_EXEC(a) a; +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + d2_s32 error; + const char * func; + int line; +} log_error_entry; + +/********************** + * STATIC PROTOTYPES + **********************/ +#ifdef LOG_ERRORS + static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line); +#endif +static void invalidate_cache(void); + +void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +/********************** + * STATIC VARIABLES + **********************/ +#ifdef LOG_ERRORS + static log_error_entry log_error_list[ERROR_LIST_SIZE]; + static int error_list_index; + static int error_count; +#endif + +static d2_device * _d2_handle; +static d2_renderbuffer * renderbuffer; + +static d2_s32 src_cf_val, dst_cf_val; +static lv_draw_img_dsc_t img_dsc; +static bool color_key_enabled, alpha_enabled, blend_enabled, colorize_enabled; + +/********************** + * STATIC FUNCTIONS + **********************/ +static d2_s32 lv_port_gpu_cf_lv_to_d2(lv_img_cf_t cf) +{ + d2_s32 d2_cf; + +#if (DLG_LVGL_CF == 1) + switch(cf & ~(1 << 5)) { +#else + switch(cf) { +#endif /* (DLG_LVGL_CF == 1) */ + case LV_IMG_CF_TRUE_COLOR: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_ALPHA_1BIT: + d2_cf = d2_mode_alpha1; + break; + case LV_IMG_CF_ALPHA_2BIT: + d2_cf = d2_mode_alpha2; + break; + case LV_IMG_CF_ALPHA_4BIT: + d2_cf = d2_mode_alpha4; + break; + case LV_IMG_CF_ALPHA_8BIT: + d2_cf = d2_mode_alpha8; + break; + case LV_IMG_CF_INDEXED_1BIT: + d2_cf = d2_mode_i1 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_2BIT: + d2_cf = d2_mode_i2 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_4BIT: + d2_cf = d2_mode_i4 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_8BIT: + d2_cf = d2_mode_i8 | d2_mode_clut; + break; +#if (DLG_LVGL_CF == 1) + case LV_IMG_CF_RGB565: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_RGB888: + d2_cf = d2_mode_rgb888; + break; + case LV_IMG_CF_RGBA8888: + d2_cf = d2_mode_rgba8888; + break; +#endif /* DLG_LVGL_CF */ + default: + return -1; + } + +#if (DLG_LVGL_CF == 1) + return d2_cf | (cf & (1 << 5) ? d2_mode_rle : 0); +#else + return d2_cf; +#endif /* (DLG_LVGL_CF == 1) */ +} + +static bool lv_port_gpu_cf_fb_valid(d2_s32 cf) +{ + if((cf & (d2_mode_rle | d2_mode_clut)) || cf < 0) { + return false; + } + + switch(cf) { + case d2_mode_alpha8: + case d2_mode_rgb565: + case d2_mode_argb8888: + case d2_mode_argb4444: + case d2_mode_rgba8888: + case d2_mode_rgba4444: + return true; + default: + return false; + } +} + +static bool lv_port_gpu_cf_has_alpha(d2_s32 cf) +{ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_argb8888: + case d2_mode_rgba8888: + case d2_mode_argb4444: + case d2_mode_rgba4444: + case d2_mode_argb1555: + case d2_mode_rgba5551: + case d2_mode_ai44: + case d2_mode_i8: + case d2_mode_i4: + case d2_mode_i2: + case d2_mode_i1: + case d2_mode_alpha8: + case d2_mode_alpha4: + case d2_mode_alpha2: + case d2_mode_alpha1: + return true; + default: + return false; + } +} + +static bool lv_port_gpu_cf_is_alpha(d2_s32 cf) +{ + switch(cf & ~d2_mode_rle) { + case d2_mode_alpha8: + case d2_mode_alpha4: + case d2_mode_alpha2: + case d2_mode_alpha1: + return true; + default: + return false; + } +} + +static d2_color lv_port_gpu_color_lv_to_d2(lv_color_t color) +{ + uint8_t alpha, red, green, blue; + + alpha = 0xFF; + red = color.ch.red << 3 | color.ch.red >> 2; + green = color.ch.green << 2 | color.ch.green >> 4; + blue = color.ch.blue << 3 | color.ch.blue >> 2; + + return (alpha) << 24UL + | (red) << 16UL + | (green) << 8UL + | (blue) << 0UL; +} + +static void lv_port_gpu_get_recolor_consts(d2_color * cl, d2_color * ch) +{ + d2_color c = lv_port_gpu_color_lv_to_d2(img_dsc.recolor); + d2_alpha r, g, b, opa = img_dsc.recolor_opa > LV_OPA_MAX ? LV_OPA_COVER : img_dsc.recolor_opa; + + r = ((uint32_t)((uint8_t)(c >> 16UL)) * opa) / 255; + g = ((uint32_t)((uint8_t)(c >> 8UL)) * opa) / 255; + b = ((uint32_t)((uint8_t)(c >> 0UL)) * opa) / 255; + *cl = r << 16UL | g << 8UL | b << 0UL; + + r += 255 - opa; + g += 255 - opa; + b += 255 - opa; + *ch = r << 16UL | g << 8UL | b << 0UL; +} + +static int lv_port_gpu_handle_indexed_color(const lv_color_t ** src, const d2_color ** clut, d2_s32 cf) +{ + int clut_len = 0; + + if(cf & d2_mode_clut) { + /* Calculate CLUT length in entries */ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_i1: + clut_len = 2; + break; + case d2_mode_i2: + clut_len = 4; + break; + case d2_mode_i4: + clut_len = 16; + break; + case d2_mode_i8: + clut_len = 256; + break; + case d2_mode_ai44: + clut_len = 16; + break; + default: + return 0; + } + + *clut = (const d2_color *)*src; + *src = (const lv_color_t *)((const uint32_t *)*src + clut_len); + } + return clut_len; +} + +static int lv_port_gpu_cf_bpp(d2_s32 cf) +{ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_argb8888: + return 32; + case d2_mode_rgba8888: + return 32; + case d2_mode_rgb888: + return 32; + case d2_mode_argb4444: + return 16; + case d2_mode_rgba4444: + return 16; + case d2_mode_argb1555: + return 16; + case d2_mode_rgba5551: + return 16; + case d2_mode_rgb565: + return 16; + case d2_mode_ai44: + return 8; + case d2_mode_i8: + return 8; + case d2_mode_i4: + return 4; + case d2_mode_i2: + return 2; + case d2_mode_i1: + return 1; + case d2_mode_alpha8: + return 8; + case d2_mode_alpha4: + return 4; + case d2_mode_alpha2: + return 2; + case d2_mode_alpha1: + return 1; + default: + return 0; + } +} + +static d2_s32 lv_port_gpu_cf_get_default(void) +{ + return d2_mode_rgb565; +} + +static void lv_port_gpu_config_blit_clear(void) +{ + alpha_enabled = false; + color_key_enabled = false; + blend_enabled = true; + colorize_enabled = false; + + lv_draw_img_dsc_init(&img_dsc); + + src_cf_val = lv_port_gpu_cf_get_default(); + dst_cf_val = lv_port_gpu_cf_get_default(); +} + +void lv_port_gpu_init(void) +{ + lv_port_gpu_config_blit_clear(); +} + +static void lv_port_gpu_rotate_point(int * x, int * y, float cos_angle, float sin_angle, int pivot_x, int pivot_y) +{ + float fx, fy; + + *x -= pivot_x; + *y -= pivot_y; + + fx = ((float) * x) / 16.0f; + fy = ((float) * y) / 16.0f; + + *x = (int)(((fx * cos_angle) - (fy * sin_angle)) * 16.0f); + *y = (int)(((fx * sin_angle) + (fy * cos_angle)) * 16.0f); + + *x += pivot_x; + *y += pivot_y; +} + +void lv_draw_ra6m3_g2d_init(void) +{ + if(_d2_handle != NULL) { + return; + } + + _d2_handle = d2_opendevice(0); + + if(_d2_handle == NULL) + return; + + /* set blocksize for default displaylist */ + if(d2_setdlistblocksize(_d2_handle, 25) != D2_OK) { + LV_LOG_ERROR("Could NOT d2_setdlistblocksize\n"); + d2_closedevice(_d2_handle); + + return; + } + + /* bind the hardware */ + if(d2_inithw(_d2_handle, 0) != D2_OK) { + LV_LOG_ERROR("Could NOT d2_inithw\n"); + d2_closedevice(_d2_handle); + + return; + } + + renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); + if(!renderbuffer) { + LV_LOG_ERROR("NO renderbuffer\n"); + d2_closedevice(_d2_handle); + + return; + } +} + +static void lv_port_gpu_hw_deinit(void) +{ + if(_d2_handle == NULL) + return; + + D2_EXEC(d2_freerenderbuffer(_d2_handle, renderbuffer)); + D2_EXEC(d2_closedevice(_d2_handle)); + + renderbuffer = NULL; + _d2_handle = NULL; +} + +void lv_port_gpu_flush(void) +{ + lv_port_gpu_hw_deinit(); +} + +static void lv_port_gpu_start_render(void) +{ + D2_EXEC(d2_selectrenderbuffer(_d2_handle, renderbuffer)); +} + +static void lv_port_gpu_complete_render(void) +{ + D2_EXEC(d2_flushframe(_d2_handle)); +} + +void lv_port_gpu_wait(lv_draw_ctx_t * draw_ctx) +{ + lv_port_gpu_complete_render(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_port_gpu_execute_render(void) +{ + if(_d2_handle) { + D2_EXEC(d2_executerenderbuffer(_d2_handle, renderbuffer, 0)); + } +} + +void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area) +{ + uint32_t ModeSrc; + + ModeSrc = d2_mode_rgb565; + + lv_coord_t dst_width, dst_hight; + dst_width = lv_area_get_width(fill_area); + dst_hight = lv_area_get_height(fill_area); + + d2_selectrenderbuffer(_d2_handle, renderbuffer); + + // Generate render operations + d2_framebuffer(_d2_handle, (uint16_t *)&fb_background[0], LV_HOR_RES_MAX, LV_HOR_RES_MAX, + MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default()); + + d2_cliprect(_d2_handle, 0, 0, LV_HOR_RES_MAX - 1, fill_area->y2); + d2_setblitsrc(_d2_handle, (void *) dst, dst_width, dst_width, dst_hight, ModeSrc); + d2_blitcopy(_d2_handle, dst_width, dst_hight, 0, 0, D2_FIX4(dst_width), D2_FIX4(dst_hight), + D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), 0); + + // Execute render operations + d2_executerenderbuffer(_d2_handle, renderbuffer, 0); +} + +void lv_port_gpu_fill(lv_color_t * dest_buf, const lv_area_t * fill_area, lv_coord_t dst_width, + lv_color_t color, lv_opa_t opa) +{ + invalidate_cache(); + + lv_port_gpu_start_render(); + + D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dest_buf), MAX(dst_width, 2), MAX(dst_width, 2), + MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default())); + + D2_EXEC(d2_cliprect(_d2_handle, 0, 0, dst_width - 1, fill_area->y2)); + D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? 0xFF : opa)); + D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(color))); + D2_EXEC(d2_renderbox(_d2_handle, D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), + D2_FIX4(lv_area_get_width(fill_area)), D2_FIX4(lv_area_get_height(fill_area)))); + + lv_port_gpu_execute_render(); +} + +bool lv_port_gpu_config_blit(const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t dst_cf, + lv_img_cf_t src_cf, bool alpha_en, bool color_key_en, bool blend_en, bool colorize_en) +{ + d2_s32 d2_src_cf, d2_dst_cf; + + if(blend_en && draw_dsc->blend_mode != LV_BLEND_MODE_NORMAL + && draw_dsc->blend_mode != LV_BLEND_MODE_ADDITIVE) { + return false; + } + + d2_src_cf = lv_port_gpu_cf_lv_to_d2(src_cf); + d2_dst_cf = lv_port_gpu_cf_lv_to_d2(dst_cf); + if(d2_src_cf < 0 || !lv_port_gpu_cf_fb_valid(d2_dst_cf)) { + return false; + } + src_cf_val = d2_src_cf; + dst_cf_val = d2_dst_cf; + + img_dsc = *draw_dsc; + + /* Disable alpha if alpha channel does not exist */ + alpha_enabled = lv_port_gpu_cf_has_alpha(src_cf_val) ? alpha_en : 0; + color_key_enabled = color_key_en; + blend_enabled = blend_en; + colorize_enabled = colorize_en | lv_port_gpu_cf_is_alpha(src_cf_val); + + return true; +} + +static void lv_port_gpu_blit_internal(const lv_area_t * dest_area, const lv_color_t * src_buf, + const lv_area_t * src_area, d2_u32 flags) +{ + const lv_area_t * img_area = src_area; + lv_area_t img_area_scaled; + lv_coord_t w, h, img_w, img_h; + d2_s32 pitch; + int bpp = lv_port_gpu_cf_bpp(src_cf_val); + + D2_EXEC(d2_cliprect(_d2_handle, dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2)); + + pitch = w = lv_area_get_width(src_area); + h = lv_area_get_height(src_area); + + if(img_dsc.zoom != LV_IMG_ZOOM_NONE) { + img_area_scaled.x1 = src_area->x1 + ((((int32_t)0 - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x; + img_area_scaled.x2 = src_area->x1 + ((((int32_t)w - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x; + img_area_scaled.y1 = src_area->y1 + ((((int32_t)0 - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y; + img_area_scaled.y2 = src_area->y1 + ((((int32_t)h - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y; + img_area = &img_area_scaled; + } + + img_w = lv_area_get_width(img_area); + img_h = lv_area_get_height(img_area); + + if(0 < bpp && bpp < 8) { + pitch = (w + (8 - bpp)) & (~(8 - bpp)); + } + + if(img_dsc.angle == 0) { + D2_EXEC(d2_setblitsrc(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val)); + + D2_EXEC(d2_blitcopy(_d2_handle, w, h, 0, 0, + D2_FIX4(img_w), D2_FIX4(img_h), D2_FIX4(img_area->x1), D2_FIX4(img_area->y1), flags)); + } + else { + int x, y, x1, y1, x2, y2, x3, y3, x4, y4, dxu, dxv, dyu, dyv, xx, xy, yx, yy; + int pivot_scaled_x, pivot_scaled_y; + int tex_offset = (flags & d2_bf_filter) ? -32767 : 0; + d2_u8 amode, cmode = d2_to_copy; + float angle = ((float)img_dsc.angle / 10) * M_PI / 180; + float cos_angle = cosf(angle); + float sin_angle = sinf(angle); + d2_u8 fillmode_backup; + + /* setup texture params */ + fillmode_backup = d2_getfillmode(_d2_handle); + D2_EXEC(d2_setfillmode(_d2_handle, d2_fm_texture)); + D2_EXEC(d2_settexture(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val)); + D2_EXEC(d2_settexturemode(_d2_handle, flags & (d2_bf_filter | d2_bf_wrap))); + amode = flags & d2_bf_usealpha ? d2_to_copy : d2_to_one; + cmode = flags & d2_bf_colorize2 ? d2_to_blend : d2_to_copy; + D2_EXEC(d2_settextureoperation(_d2_handle, amode, cmode, cmode, cmode)); + if(flags & d2_bf_colorize2) { + d2_color cl = d2_getcolor(_d2_handle, 0), ch = d2_getcolor(_d2_handle, 1); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_red, (uint8_t)(cl >> 16UL), + (uint8_t)(ch >> 16UL))); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_green, (uint8_t)(cl >> 8UL), + (uint8_t)(ch >> 8UL))); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_blue, (uint8_t)(cl >> 0UL), + (uint8_t)(ch >> 0UL))); + } + + x = D2_FIX4(img_area->x1); + y = D2_FIX4(img_area->y1); + + /* define quad points */ + x1 = D2_FIX4(0); + y1 = D2_FIX4(0); + x2 = D2_FIX4(img_w); + y2 = D2_FIX4(0); + x3 = D2_FIX4(img_w); + y3 = D2_FIX4(img_h); + x4 = D2_FIX4(0); + y4 = D2_FIX4(img_h); + + /* rotate points for quad */ + pivot_scaled_x = (img_dsc.pivot.x * img_dsc.zoom) >> 4; + pivot_scaled_y = (img_dsc.pivot.y * img_dsc.zoom) >> 4; + + lv_port_gpu_rotate_point(&x1, &y1, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x2, &y2, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x3, &y3, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x4, &y4, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + + /* compute texture increments */ + xx = (int)(cos_angle * 65536.0f); + xy = (int)(sin_angle * 65536.0f); + yx = (int)(-sin_angle * 65536.0f); + yy = (int)(cos_angle * 65536.0f); + dxu = ((D2_FIX16(w) / D2_FIX4(img_w)) * xx) >> 12; + dxv = ((D2_FIX16(w) / D2_FIX4(img_w)) * xy) >> 12; + dyu = ((D2_FIX16(h) / D2_FIX4(img_h)) * yx) >> 12; + dyv = ((D2_FIX16(h) / D2_FIX4(img_h)) * yy) >> 12; + + /* map texture exactly to rotated quad, so texel center is always (0/0) top-left */ + D2_EXEC(d2_settexelcenter(_d2_handle, 0, 0)); + D2_EXEC(d2_settexturemapping(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1), + tex_offset, tex_offset, dxu, dxv, dyu, dyv)); + + int minx = MAX(dest_area->x1, D2_INT4(x + MIN(x1, MIN(x2, MIN(x3, x4))))); + int maxx = MIN(dest_area->x2, D2_INT4(x + MAX(x1, MAX(x2, MAX(x3, x4))))); + int slice = (flags & d2_bf_filter) ? 6 : 8; + + /* Perform render operation in slices to acheive better performance */ + for(int posx = minx; posx < maxx; posx += slice) { + D2_EXEC(d2_cliprect(_d2_handle, posx, dest_area->y1, MIN(posx + slice - 1, maxx), dest_area->y2)); + D2_EXEC(d2_renderquad(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1), + (d2_point)(x + x2), (d2_point)(y + y2), + (d2_point)(x + x3), (d2_point)(y + y3), + (d2_point)(x + x4), (d2_point)(y + y4), 0)); + } + D2_EXEC(d2_setfillmode(_d2_handle, fillmode_backup)); + } +} + +void lv_port_ra_gpu_blit(lv_color_t * dst, const lv_area_t * dst_area, lv_coord_t dest_stride, + const lv_color_t * src, const lv_area_t * src_area, lv_opa_t opa) +{ + d2_u32 flags = 0; + const d2_color * clut = NULL; + int clut_len = 0; + + invalidate_cache(); + + clut_len = lv_port_gpu_handle_indexed_color(&src, &clut, src_cf_val); + + lv_port_gpu_start_render(); + + D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dst), MAX(dest_stride, 2), + MAX(dst_area->x2 + 1, 2), MAX(dst_area->y2 + 1, 2), dst_cf_val)); + + flags |= alpha_enabled ? d2_bf_usealpha : 0; + + D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? LV_OPA_COVER : opa)); + + if(clut) { + D2_EXEC(d2_writetexclut_direct(_d2_handle, clut, 0, clut_len)); + } + + flags |= color_key_enabled ? d2_bf_usealpha : 0; + flags |= (colorize_enabled || img_dsc.recolor_opa != LV_OPA_TRANSP) ? d2_bf_colorize2 : 0; + if(colorize_enabled) { + D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(img_dsc.recolor))); + D2_EXEC(d2_setcolor(_d2_handle, 1, lv_port_gpu_color_lv_to_d2(img_dsc.recolor))); + } + else if(img_dsc.recolor_opa != LV_OPA_TRANSP) { + d2_color cl = 0, ch = 0; + lv_port_gpu_get_recolor_consts(&cl, &ch); + D2_EXEC(d2_setcolor(_d2_handle, 0, cl)); + D2_EXEC(d2_setcolor(_d2_handle, 1, ch)); + } + + flags |= ((img_dsc.angle || img_dsc.zoom != LV_IMG_ZOOM_NONE) && img_dsc.antialias) ? d2_bf_filter : 0; + + if(blend_enabled) { + D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_alpha, + img_dsc.blend_mode != LV_BLEND_MODE_NORMAL ? d2_bm_one : d2_bm_one_minus_alpha)); + D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_one_minus_alpha)); + } + else { + D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero)); + D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_zero)); + } + + lv_port_gpu_blit_internal(dst_area, src, src_area, flags); + + lv_port_gpu_execute_render(); +} + +void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + bool done = false; + + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_color_t * dest_buf = draw_ctx->buf; + + const lv_color_t * src_buf = dsc->src_buf; + if(src_buf) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + + lv_port_ra_gpu_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, dsc->opa); + done = true; + } + else if(dsc->opa >= LV_OPA_MAX) { + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_port_gpu_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa); + done = true; + } + } + + if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_port_gpu_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +{ + /*TODO basic ARGB8888 image can be handles here*/ + + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); +} + +void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_ra6m3_dma2d_ctx_t * ra_2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend; + ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded; + ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait; + ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter; + //ra_2d_draw_ctx->base_draw.buffer_copy = lv_draw_ra6m3_2d_buffer_copy; +} + +void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_t * disp, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(disp); + LV_UNUSED(draw_ctx); +} + +static void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); +} + +#ifdef LOG_ERRORS +static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line) +{ + if(status) { + log_error_list[error_list_index].error = status; + log_error_list[error_list_index].func = func; + log_error_list[error_list_index].line = line; + LV_LOG_ERROR("%s\r\n", d2_geterrorstring(_d2_handle)); + LV_LOG_ERROR("%d:\t%d - %s : %d\r\n", error_count, + log_error_list[error_list_index].error, + log_error_list[error_list_index].func, + log_error_list[error_list_index].line); + + error_count++; + error_list_index++; + if(error_list_index >= ERROR_LIST_SIZE) { + error_list_index = 0; + } + } +} +#endif +#endif /* LV_USE_GPU_RA6M3_G2D */ diff --git a/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h b/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h new file mode 100644 index 0000000..5d37ce4 --- /dev/null +++ b/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h @@ -0,0 +1,56 @@ +/** + * @file lv_gpu_d2_ra6m3.h + * + */ +#ifndef LV_GPU_D2_RA6M3_H +#define LV_GPU_D2_RA6M3_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" + +#if LV_USE_GPU_RA6M3_G2D +#include "../../core/lv_disp.h" +#include "../sw/lv_draw_sw.h" + +/********************** + * DEFINE + **********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#define M_PI 3.1415926 + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_ra6m3_dma2d_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_draw_ra6m3_g2d_init(void); + +void lv_port_gpu_init(void); + +void lv_port_gpu_flush(void); + +void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area); + +void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_ra6m3_2d_ctx_deinit(lv_disp_drv_t * disp, lv_draw_ctx_t * draw_ctx); + +#endif /*LV_USE_GPU_GD32_IPA*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_arc.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_arc.c index 5786eae..f43fef6 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_arc.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_arc.c @@ -104,7 +104,9 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds } lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); - SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + bool texture_cached = false; + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h, + &texture_cached); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); dump_masks(texture, &draw_area, mask_ids, mask_ids_count, cap_ids[0] != LV_MASK_ID_INV ? cap_ids : NULL); @@ -135,6 +137,11 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds SDL_SetTextureColorMod(texture, color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture, dsc->opa); SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + + if(!texture_cached) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.c index e6007d1..9bf6385 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.c @@ -86,7 +86,8 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor LV_ASSERT(internals->mask == NULL && internals->composition == NULL && internals->target_backup == NULL); lv_coord_t w = lv_area_get_width(apply_area), h = lv_area_get_height(apply_area); - internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h); + internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h, + &internals->composition_cached); /* Don't need to worry about integral overflow */ lv_coord_t ofs_x = (lv_coord_t) - apply_area->x1, ofs_y = (lv_coord_t) - apply_area->y1; /* Offset draw area to start with (0,0) of coords */ @@ -95,9 +96,13 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor internals->target_backup = SDL_GetRenderTarget(ctx->renderer); SDL_SetRenderTarget(ctx->renderer, internals->composition); SDL_SetRenderDrawColor(ctx->renderer, 255, 255, 255, 0); - SDL_RenderClear(ctx->renderer); + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE); + SDL_RenderFillRect(ctx->renderer, NULL); + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); #if LV_GPU_SDL_CUSTOM_BLEND_MODE - internals->mask = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, w, h); + internals->mask = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, w, h, + &internals->composition_cached); dump_masks(internals->mask, apply_area); #endif } @@ -171,19 +176,23 @@ void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_ break; } SDL_RenderCopy(ctx->renderer, internals->composition, &src_rect, &dst_rect); + if(!internals->composition_cached) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(internals->composition); + } } internals->mask = internals->composition = internals->target_backup = NULL; } SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, - lv_coord_t w, lv_coord_t h) + lv_coord_t w, lv_coord_t h, bool * texture_in_cache) { lv_point_t * tex_size = NULL; composite_key_t mask_key = mask_key_create(id); SDL_Texture * result = lv_draw_sdl_texture_cache_get_with_userdata(ctx, &mask_key, sizeof(composite_key_t), NULL, (void **) &tex_size); - if(!result || tex_size->x < w || tex_size->y < h) { + if(result == NULL || tex_size->x < w || tex_size->y < h) { lv_coord_t size = next_pow_of_2(LV_MAX(w, h)); int access = SDL_TEXTUREACCESS_STREAMING; if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0) { @@ -195,8 +204,19 @@ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_d result = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, access, size, size); tex_size = lv_mem_alloc(sizeof(lv_point_t)); tex_size->x = tex_size->y = size; - lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, tex_size, lv_mem_free, 0); + bool in_cache = lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, + tex_size, lv_mem_free, 0); + if(!in_cache) { + lv_mem_free(tex_size); + } + if(texture_in_cache != NULL) { + *texture_in_cache = in_cache; + } } + else if(texture_in_cache != NULL) { + *texture_in_cache = true; + } + return result; } diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.h b/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.h index 72a2dae..57191bb 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.h +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_composite.h @@ -45,6 +45,7 @@ typedef enum lv_draw_sdl_composite_texture_id_t { /** * Begin drawing with mask. Render target will be switched to a temporary texture, * and drawing coordinates may get clipped or translated + * @param ctx Drawing context * @param coords_in Original coordinates * @param clip_in Original clip area * @param extension Useful for shadows or outlines, can be NULL @@ -59,8 +60,18 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_area, lv_blend_mode_t blend_mode); +/** + * + * @param ctx Drawing context + * @param id Texture ID + * @param w Maximum width needed + * @param h Maximum height needed + * @param texture_in_cache output to query if the texture is in cache. If it's not in cache, you'll need to destroy it + * by yourself + * @return Obtained texture + */ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, - lv_coord_t w, lv_coord_t h); + lv_coord_t w, lv_coord_t h, bool * texture_in_cache); /********************** * MACROS diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.c index 59a9fc0..4dddc8c 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.c @@ -72,7 +72,8 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con lv_coord_t radius); static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, - const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius); + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius, + bool * in_cache); static lv_draw_img_rounded_key_t rounded_key_create(const SDL_Texture * texture, lv_coord_t w, lv_coord_t h, lv_coord_t radius); @@ -106,11 +107,16 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t lv_draw_sdl_img_header_t * header = NULL; SDL_Texture * texture = lv_draw_sdl_texture_cache_get_with_userdata(ctx, key, key_size, &texture_found, (void **) &header); + bool texture_in_cache = false; if(!texture_found) { - lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header); + lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header, + &texture_in_cache); + } + else { + texture_in_cache = true; } SDL_free(key); - if(!texture) { + if(!texture || !header) { return LV_RES_INV; } @@ -148,6 +154,14 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t lv_draw_sdl_composite_end(ctx, &apply_area, draw_dsc->blend_mode); + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + if(!header->managed) { + SDL_DestroyTexture(texture); + } + lv_mem_free(header); + } + return LV_RES_OK; } @@ -185,7 +199,7 @@ static void calc_draw_part(SDL_Texture * texture, const lv_draw_sdl_img_header_t bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, const void * src, int32_t frame_id, SDL_Texture ** texture, - lv_draw_sdl_img_header_t ** header) + lv_draw_sdl_img_header_t ** header, bool * texture_in_cache) { _lv_img_cache_entry_t * cdsc = _lv_img_cache_open(src, lv_color_white(), frame_id); lv_draw_sdl_cache_flag_t tex_flags = 0; @@ -210,16 +224,18 @@ bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key #endif } if(texture && cdsc) { - *header = SDL_malloc(sizeof(lv_draw_sdl_img_header_t)); + *header = lv_mem_alloc(sizeof(lv_draw_sdl_img_header_t)); SDL_memcpy(&(*header)->base, &cdsc->dec_dsc.header, sizeof(lv_img_header_t)); (*header)->rect = rect; - lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, tex_flags); + (*header)->managed = (tex_flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) != 0; + *texture_in_cache = lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, + tex_flags); + return true; } else { - lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); + *texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); return false; } - return true; } /********************** @@ -320,7 +336,8 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con { const int w = lv_area_get_width(coords), h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(radius, w, h); - SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius); + bool frag_in_cache = false; + SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius, &frag_in_cache); apply_recolor_opa(frag, draw_dsc); lv_draw_sdl_rect_bg_frag_draw_corners(ctx, frag, real_radius, coords, clip, true); @@ -360,6 +377,11 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con SDL_RenderCopy(ctx->renderer, texture, &src_rect, &dst_rect); } SDL_RenderSetClipRect(ctx->renderer, NULL); + + if(!frag_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(frag); + } } static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * draw_dsc) @@ -377,22 +399,28 @@ static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * d } static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, - const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius) + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius, + bool * in_cache) { lv_draw_img_rounded_key_t key = rounded_key_create(texture, w, h, radius); - SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius); + bool mask_frag_in_cache = false; + SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius, &mask_frag_in_cache); SDL_Texture * img_frag = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); if(img_frag == NULL) { const lv_coord_t full_frag_size = radius * 2 + 3; img_frag = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, full_frag_size, full_frag_size); + SDL_assert(img_frag); SDL_SetTextureBlendMode(img_frag, SDL_BLENDMODE_BLEND); SDL_Texture * old_target = SDL_GetRenderTarget(ctx->renderer); SDL_SetRenderTarget(ctx->renderer, img_frag); SDL_SetRenderDrawColor(ctx->renderer, 0, 0, 0, 0); - SDL_RenderClear(ctx->renderer); + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE); + SDL_RenderFillRect(ctx->renderer, NULL); + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); - lv_area_t coords = {0, 0, w - 1, h - 1}, clip; + lv_area_t coords = {0, 0, w - 1, h - 1}; lv_area_t frag_coords = {0, 0, full_frag_size - 1, full_frag_size - 1}; lv_draw_sdl_rect_bg_frag_draw_corners(ctx, mask_frag, radius, &frag_coords, NULL, false); @@ -443,7 +471,14 @@ static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Textur SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(ctx->renderer, old_target); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + } + else { + *in_cache = true; + } + if(!mask_frag_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(mask_frag); } return img_frag; } diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.h b/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.h index 0e27027..6233913 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.h +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_img.h @@ -35,6 +35,7 @@ extern "C" { typedef struct lv_draw_sdl_img_header_t { lv_img_header_t base; SDL_Rect rect; + bool managed; } lv_draw_sdl_img_header_t; /********************** @@ -56,9 +57,22 @@ typedef struct lv_draw_sdl_img_header_t { /*===================== * Other functions *====================*/ +/** + * + * @param ctx Drawing context + * @param key Texture cache key + * @param key_size Size of texture cache key + * @param src Image source pointer + * @param frame_id Frame ID for animated image + * @param texture Texture for render + * @param header Header also holds sdl image info + * @param texture_in_cache Whether the texture has been put in the cache. Please note for managed texture, + * this will be false too. So you'll need to check header.managed too. + * @return Whether the image has been loaded successfully + */ bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, const void * src, int32_t frame_id, SDL_Texture ** texture, - lv_draw_sdl_img_header_t ** header); + lv_draw_sdl_img_header_t ** header, bool * texture_in_cache); /********************** * MACROS **********************/ diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_label.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_label.c index b8c79ae..d043c51 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_label.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_label.c @@ -54,7 +54,7 @@ static lv_font_glyph_key_t font_key_glyph_create(const lv_font_t * font_p, uint3 * GLOBAL FUNCTIONS **********************/ -void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, +void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter) { const lv_area_t * clip_area = draw_ctx->clip_area; @@ -117,6 +117,7 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t lv_font_glyph_key_t glyph_key = font_key_glyph_create(font_p, letter); bool glyph_found = false; SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &glyph_key, sizeof(glyph_key), &glyph_found); + bool in_cache = false; if(!glyph_found) { if(g.resolved_font) { font_p = g.resolved_font; @@ -128,7 +129,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t texture = SDL_CreateTextureFromSurface(renderer, mask); SDL_FreeSurface(mask); lv_mem_free(buf); - lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + in_cache = lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + } + else { + in_cache = true; } if(!texture) { return; @@ -142,6 +146,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t /*If the letter is completely out of mask don't draw it*/ if(!_lv_area_intersect(&draw_area, &t_letter, &t_clip)) { + if(!in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } return; } SDL_Rect srcrect, dstrect; @@ -156,6 +164,11 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t SDL_RenderCopy(renderer, texture, &srcrect, &dstrect); lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); + + if(!in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c index 48bc1b8..d517636 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c @@ -58,15 +58,24 @@ lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_l enum lv_draw_sdl_composite_texture_id_t texture_id = LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0 + ctx->internals->transform_count; - transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h); + transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h, + &transform_ctx->target_in_cache); transform_ctx->target_rect.x = 0; transform_ctx->target_rect.y = 0; transform_ctx->target_rect.w = target_w; transform_ctx->target_rect.h = target_h; + layer_ctx->max_row_with_alpha = target_h; + layer_ctx->max_row_with_no_alpha = target_h; + SDL_SetTextureBlendMode(transform_ctx->target, SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(renderer, transform_ctx->target); - SDL_RenderClear(renderer); + + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderFillRect(renderer, NULL); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); /* Set proper drawing context for transform layer */ ctx->internals->transform_count += 1; @@ -100,6 +109,7 @@ void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * lay lv_area_to_sdl_rect(layer_ctx->original.clip_area, &clip_rect); SDL_Point center = {.x = draw_dsc->pivot.x, .y = draw_dsc->pivot.y}; SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_SetTextureAlphaMod(transform_ctx->target, draw_dsc->opa); SDL_RenderCopyEx(renderer, transform_ctx->target, &transform_ctx->target_rect, &trans_rect, draw_dsc->angle, ¢er, SDL_FLIP_NONE); SDL_RenderSetClipRect(renderer, NULL); @@ -108,6 +118,11 @@ void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * lay void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) { lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx; + if(!transform_ctx->target_in_cache && transform_ctx->target != NULL) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(transform_ctx->target); + } ctx->internals->transform_count -= 1; } diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h b/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h index b60303c..f6aa668 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h @@ -28,6 +28,7 @@ typedef struct _lv_draw_sdl_layer_ctx_t { SDL_Texture * orig_target; SDL_Texture * target; SDL_Rect target_rect; + bool target_in_cache; lv_draw_layer_flags_t flags; } lv_draw_sdl_layer_ctx_t; /********************** diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_line.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_line.c index 8dd7b2e..204e1a3 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_line.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_line.c @@ -53,7 +53,7 @@ static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_d * GLOBAL FUNCTIONS **********************/ void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, - const lv_point_t * point2) + const lv_point_t * point2, bool * in_cache) { lv_draw_sdl_ctx_t * sdl_ctx = (lv_draw_sdl_ctx_t *) draw_ctx; SDL_Renderer * renderer = sdl_ctx->renderer; @@ -68,7 +68,7 @@ void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * SDL_Texture * texture = lv_draw_sdl_texture_cache_get(sdl_ctx, &key, sizeof(key), NULL); if(!texture) { texture = line_texture_create(sdl_ctx, dsc, (lv_coord_t) length); - lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); } lv_area_t coords = {x1, y1, x2, y2}; @@ -126,7 +126,10 @@ static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_d SDL_SetRenderTarget(sdl_ctx->renderer, texture); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(sdl_ctx->renderer, 0xFF, 0xFF, 0xFF, 0x0); - SDL_RenderClear(sdl_ctx->renderer); + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(sdl_ctx->renderer, SDL_BLENDMODE_NONE); + SDL_RenderFillRect(sdl_ctx->renderer, NULL); + SDL_SetRenderDrawBlendMode(sdl_ctx->renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(sdl_ctx->renderer, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect line_rect = {1 + dsc->width / 2, 1, length, dsc->width}; SDL_RenderFillRect(sdl_ctx->renderer, &line_rect); diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c index c5df50c..68305c7 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c @@ -77,7 +77,9 @@ void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dr int16_t mask_id = lv_draw_mask_add(&polygon_param, NULL); lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); - SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + bool texture_in_cache = false; + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h, + &texture_in_cache); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); dump_masks(texture, &draw_area); @@ -91,6 +93,10 @@ void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dr SDL_SetTextureColorMod(texture, color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture, draw_dsc->bg_opa); SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_priv.h b/lib/lvgl/src/draw/sdl/lv_draw_sdl_priv.h index 24a8762..ffc191b 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_priv.h +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_priv.h @@ -35,6 +35,7 @@ typedef struct lv_draw_sdl_context_internals_t { lv_lru_t * texture_cache; SDL_Texture * mask; SDL_Texture * composition; + bool composition_cached; SDL_Texture * target_backup; uint8_t transform_count; } lv_draw_sdl_context_internals_t; diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.c index a303ac7..149dcbf 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.c @@ -27,6 +27,8 @@ * DEFINES *********************/ +#define FRAG_SPACING 3 + /********************** * TYPEDEFS **********************/ @@ -37,6 +39,23 @@ typedef struct { lv_coord_t size; } lv_draw_rect_bg_key_t; +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; + uint8_t stops_count; + lv_grad_dir_t dir; +} lv_draw_rect_grad_strip_key_t; + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; + uint8_t stops_count; + lv_grad_dir_t dir; + lv_coord_t w; + lv_coord_t h; + lv_coord_t radius; +} lv_draw_rect_grad_frag_key_t; + typedef struct { lv_sdl_cache_key_magic_t magic; lv_coord_t radius; @@ -57,6 +76,12 @@ typedef struct { static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc); +static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_grad_dsc_t * grad, bool blend_mod); + +static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc); @@ -81,6 +106,11 @@ static void frag_render_center(SDL_Renderer * renderer, SDL_Texture * frag, lv_c static lv_draw_rect_bg_key_t rect_bg_key_create(lv_coord_t radius, lv_coord_t size); +static lv_draw_rect_grad_frag_key_t rect_grad_frag_key_create(const lv_grad_dsc_t * grad, lv_coord_t w, lv_coord_t h, + lv_coord_t radius); + +static lv_draw_rect_grad_strip_key_t rect_grad_strip_key_create(const lv_grad_dsc_t * grad); + static lv_draw_rect_shadow_key_t rect_shadow_key_create(lv_coord_t radius, lv_coord_t size, lv_coord_t blur); static lv_draw_rect_border_key_t rect_border_key_create(lv_coord_t rout, lv_coord_t rin, const lv_area_t * outer_area, @@ -145,20 +175,106 @@ void lv_draw_sdl_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); } -SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius) +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius, bool * in_cache) { lv_draw_rect_bg_key_t key = rect_bg_key_create(radius, radius); - lv_area_t coords = {0, 0, radius * 2 - 1, radius * 2 - 1}; - lv_area_t coords_frag = {0, 0, radius - 1, radius - 1}; SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); if(texture == NULL) { + lv_area_t coords = {0, 0, radius * 2 - 1, radius * 2 - 1}; + lv_area_t coords_frag = {0, 0, radius - 1, radius - 1}; lv_draw_mask_radius_param_t mask_rout_param; lv_draw_mask_radius_init(&mask_rout_param, &coords, radius, false); int16_t mask_id = lv_draw_mask_add(&mask_rout_param, NULL); texture = lv_draw_sdl_mask_dump_texture(ctx->renderer, &coords_frag, &mask_id, 1); + SDL_assert(texture != NULL); lv_draw_mask_remove_id(mask_id); - SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; + } + return texture; +} + +SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, lv_coord_t w, + lv_coord_t h, lv_coord_t radius, bool * in_cache) +{ + lv_draw_rect_grad_frag_key_t key = rect_grad_frag_key_create(grad, w, h, radius); + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + lv_area_t coords = {0, 0, radius * 2 + FRAG_SPACING - 1, radius * 2 + FRAG_SPACING - 1}; + texture = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, + lv_area_get_width(&coords), lv_area_get_height(&coords)); + SDL_assert(texture != NULL); + + lv_draw_mask_radius_param_t mask_rout_param; + lv_draw_mask_radius_init(&mask_rout_param, &coords, radius, false); + int16_t mask_id = lv_draw_mask_add(&mask_rout_param, NULL); + SDL_Texture * mask = lv_draw_sdl_mask_dump_texture(ctx->renderer, &coords, &mask_id, 1); + SDL_assert(mask != NULL); + SDL_SetTextureBlendMode(mask, SDL_BLENDMODE_NONE); + lv_draw_mask_remove_id(mask_id); + + SDL_Texture * target_backup = SDL_GetRenderTarget(ctx->renderer); + SDL_SetRenderTarget(ctx->renderer, texture); + SDL_RenderCopy(ctx->renderer, mask, NULL, NULL); + SDL_DestroyTexture(mask); + + lv_area_t blend_coords = {.x1 = 0, .y1 = 0, .x2 = w - 1, .y2 = h - 1}; + lv_area_t draw_area = {.x1 = 0, .y1 = 0, .x2 = radius - 1, .y2 = radius - 1}; + /* Align to top left */ + lv_area_align(&coords, &draw_area, LV_ALIGN_TOP_LEFT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_TOP_LEFT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + /* Align to top right */ + lv_area_align(&coords, &draw_area, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_TOP_RIGHT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + /* Align to bottom right */ + lv_area_align(&coords, &draw_area, LV_ALIGN_BOTTOM_RIGHT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_BOTTOM_RIGHT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + /* Align to bottom left */ + lv_area_align(&coords, &draw_area, LV_ALIGN_BOTTOM_LEFT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_BOTTOM_LEFT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + SDL_SetRenderTarget(ctx->renderer, target_backup); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; + } + return texture; +} + +SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, bool * in_cache) +{ + lv_draw_rect_grad_strip_key_t key = rect_grad_strip_key_create(grad); + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + Uint32 amask = 0xFF000000; + Uint32 rmask = 0x00FF0000; + Uint32 gmask = 0x0000FF00; + Uint32 bmask = 0x000000FF; + lv_color_t pixels[256]; + for(int i = 0; i < 256; i++) { + pixels[i] = lv_gradient_calculate(grad, 256, i); + } + int width = grad->dir == LV_GRAD_DIR_VER ? 1 : 256; + int height = grad->dir == LV_GRAD_DIR_VER ? 256 : 1; + SDL_Surface * surface = SDL_CreateRGBSurfaceFrom(pixels, width, height, LV_COLOR_DEPTH, width * LV_COLOR_DEPTH / 8, + rmask, gmask, bmask, amask); + texture = SDL_CreateTextureFromSurface(ctx->renderer, surface); + SDL_assert(texture != NULL); + SDL_FreeSurface(surface); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; } return texture; } @@ -193,7 +309,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); - SDL_Rect src_rect = {frag_size + 3 + sx, sy, dw, dh}; + SDL_Rect src_rect = {frag_size + FRAG_SPACING + sx, sy, dw, dh}; SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); } else { @@ -212,7 +328,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); - SDL_Rect src_rect = {frag_size + 3 + sx, frag_size + 3 + sy, dw, dh}; + SDL_Rect src_rect = {frag_size + FRAG_SPACING + sx, frag_size + FRAG_SPACING + sy, dw, dh}; SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); } else { @@ -220,7 +336,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture SDL_RenderCopyEx(ctx->renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); } } - /* Lower left, right edge should not be clip */ + /* Lower left, right edge should not be clipped */ corner_area.x1 = coords->x1; corner_area.x2 = coords->x1 + frag_size - 1; if(_lv_area_intersect(&dst_area, &corner_area, clip)) { @@ -231,7 +347,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); - SDL_Rect src_rect = {sx, frag_size + 3 + sy, dw, dh}; + SDL_Rect src_rect = {sx, frag_size + FRAG_SPACING + sy, dw, dh}; SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); } else { @@ -252,9 +368,23 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con if(dsc->bg_opa == 0) { return; } - SDL_Color bg_color; - lv_color_to_sdl_color(&dsc->bg_color, &bg_color); lv_coord_t radius = dsc->radius; + SDL_Color bg_color; + if(dsc->bg_grad.dir == LV_GRAD_DIR_NONE) { + lv_color_to_sdl_color(&dsc->bg_color, &bg_color); + } + else if(dsc->bg_grad.stops_count == 1) { + lv_color_to_sdl_color(&dsc->bg_grad.stops[0].color, &bg_color); + } + else { + if(radius <= 0) { + draw_bg_grad_simple(ctx, coords, draw_area, &dsc->bg_grad, false); + } + else { + draw_bg_grad_radius(ctx, coords, draw_area, dsc); + } + return; + } if(radius <= 0) { SDL_Rect rect; lv_area_to_sdl_rect(draw_area, &rect); @@ -267,7 +397,8 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con /*A small texture with a quarter of the rect is enough*/ lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); - SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius); + bool texture_in_cache = false; + SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius, &texture_in_cache); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetTextureAlphaMod(texture, dsc->bg_opa); @@ -275,11 +406,131 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, real_radius, coords, draw_area, false); frag_render_borders(ctx->renderer, texture, real_radius, coords, draw_area, false); frag_render_center(ctx->renderer, texture, real_radius, coords, draw_area, false); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } +} + +static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_grad_dsc_t * grad, bool blend_mod) +{ + SDL_Rect dstrect; + lv_area_to_sdl_rect(draw_area, &dstrect); + SDL_Rect srcrect; + if(grad->dir == LV_GRAD_DIR_VER) { + lv_coord_t coords_h = lv_area_get_height(coords); + srcrect.x = 0; + srcrect.y = (draw_area->y1 - coords->y1) * 255 / coords_h; + srcrect.w = 1; + srcrect.h = dstrect.h * 256 / coords_h; + + if(srcrect.y < 0 || srcrect.y > 255) { + return; + } + } + else { + lv_coord_t coords_w = lv_area_get_width(coords); + srcrect.x = (draw_area->x1 - coords->x1) * 255 / coords_w; + srcrect.y = 0; + srcrect.w = dstrect.w * 256 / coords_w; + srcrect.h = 1; + + if(srcrect.x < 0 || srcrect.x > 255) { + return; + } + } + + bool grad_texture_in_cache = false; + SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_strip_obtain(ctx, grad, &grad_texture_in_cache); + if(blend_mod) { + SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_MOD); + } + else { + SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_BLEND); + } + + SDL_RenderCopy(ctx->renderer, grad_texture, &srcrect, &dstrect); + + if(!grad_texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(grad_texture); + } +} + +static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + lv_coord_t radius = dsc->radius; + /*A small texture with a quarter of the rect is enough*/ + lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); + lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); + bool grad_texture_in_cache = false; + SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_frag_obtain(ctx, &dsc->bg_grad, bg_w, bg_h, radius, + &grad_texture_in_cache); + SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_BLEND); + + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, grad_texture, real_radius, coords, draw_area, true); + lv_area_t part_coords; + lv_area_t part_area; + if(bg_w > radius * 2) { + /*Draw left, middle, right*/ + part_coords.x1 = 0; + part_coords.x2 = radius - 1; + part_coords.y1 = radius; + part_coords.y2 = bg_h - radius - 1; + + lv_area_align(coords, &part_coords, LV_ALIGN_LEFT_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + lv_area_align(coords, &part_coords, LV_ALIGN_RIGHT_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + part_coords.x1 = radius; + part_coords.x2 = bg_w - radius - 1; + part_coords.y1 = 0; + part_coords.y2 = bg_h - 1; + lv_area_align(coords, &part_coords, LV_ALIGN_CENTER, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + } + else if(bg_h > radius * 2) { + /*Draw top, middle, bottom*/ + part_coords.x1 = radius; + part_coords.x2 = bg_w - radius - 1; + part_coords.y1 = 0; + part_coords.y2 = radius - 1; + + lv_area_align(coords, &part_coords, LV_ALIGN_TOP_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + lv_area_align(coords, &part_coords, LV_ALIGN_BOTTOM_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + part_coords.x1 = 0; + part_coords.x2 = bg_w - 1; + part_coords.y1 = radius; + part_coords.y2 = bg_h - radius - 1; + lv_area_align(coords, &part_coords, LV_ALIGN_CENTER, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + } + + if(!grad_texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(grad_texture); + } } static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc) { + LV_UNUSED(draw_area); if(SKIP_IMAGE(dsc)) return; lv_img_src_t src_type = lv_img_src_get_type(dsc->bg_img_src); @@ -409,6 +660,7 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_draw_rect_shadow_key_t key = rect_shadow_key_create(radius, frag_size, sw); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + bool texture_in_cache = false; if(texture == NULL) { lv_area_t mask_area = {blur_growth, blur_growth}, mask_area_blurred = {0, 0}; lv_area_set_width(&mask_area, frag_size * 2); @@ -427,7 +679,10 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_mem_buf_release(mask_buf); lv_draw_mask_remove_id(mask_id); SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + texture_in_cache = true; } SDL_Color shadow_color; @@ -439,6 +694,11 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, blur_frag_size, &shadow_area, clip, false); frag_render_borders(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); frag_render_center(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } @@ -520,9 +780,10 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_coord_t max_side = LV_MAX4(key.offsets.x1, key.offsets.y1, -key.offsets.x2, -key.offsets.y2); lv_coord_t frag_size = LV_MAX(radius, max_side); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + bool texture_in_cache; if(texture == NULL) { - /* Create a mask texture with size of (frag_size * 2 + 3) */ - const lv_area_t frag_area = {0, 0, frag_size * 2 + 2, frag_size * 2 + 2}; + /* Create a mask texture with size of (frag_size * 2 + FRAG_SPACING) */ + const lv_area_t frag_area = {0, 0, frag_size * 2 + FRAG_SPACING - 1, frag_size * 2 + FRAG_SPACING - 1}; /*Create mask for the outer area*/ int16_t mask_ids[2] = {LV_MASK_ID_INV, LV_MASK_ID_INV}; @@ -546,7 +807,10 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_draw_mask_remove_id(mask_ids[1]); lv_draw_mask_remove_id(mask_ids[0]); SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + texture_in_cache = true; } SDL_Rect outer_rect; @@ -560,6 +824,11 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, frag_size, outer_area, clip, true); frag_render_borders(renderer, texture, frag_size, outer_area, clip, true); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, @@ -595,7 +864,7 @@ static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_ lv_coord_t dh = lv_area_get_height(&dst_area); if(full) { lv_coord_t sy = (lv_coord_t)(dst_area.y1 - border_area.y1); - SDL_Rect src_rect = {frag_size + 1, frag_size + 3 + sy, 1, dh}; + SDL_Rect src_rect = {frag_size + 1, frag_size + FRAG_SPACING + sy, 1, dh}; SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); } else { @@ -634,7 +903,7 @@ static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_ lv_coord_t dw = lv_area_get_width(&dst_area); if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - border_area.x1); - SDL_Rect src_rect = {frag_size + 3 + sx, frag_size + 1, dw, 1}; + SDL_Rect src_rect = {frag_size + FRAG_SPACING + sx, frag_size + 1, dw, 1}; SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); } else { @@ -682,6 +951,38 @@ static lv_draw_rect_bg_key_t rect_bg_key_create(lv_coord_t radius, lv_coord_t si return key; } +static lv_draw_rect_grad_frag_key_t rect_grad_frag_key_create(const lv_grad_dsc_t * grad, lv_coord_t w, lv_coord_t h, + lv_coord_t radius) +{ + lv_draw_rect_grad_frag_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_GRAD; + key.stops_count = grad->stops_count; + key.dir = grad->dir; + for(uint8_t i = 0; i < grad->stops_count; i++) { + key.stops[i].frac = grad->stops[i].frac; + key.stops[i].color = grad->stops[i].color; + } + key.w = w; + key.h = h; + key.radius = radius; + return key; +} + +static lv_draw_rect_grad_strip_key_t rect_grad_strip_key_create(const lv_grad_dsc_t * grad) +{ + lv_draw_rect_grad_strip_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_GRAD; + key.stops_count = grad->stops_count; + key.dir = grad->dir; + for(uint8_t i = 0; i < grad->stops_count; i++) { + key.stops[i].frac = grad->stops[i].frac; + key.stops[i].color = grad->stops[i].color; + } + return key; +} + static lv_draw_rect_shadow_key_t rect_shadow_key_create(lv_coord_t radius, lv_coord_t size, lv_coord_t blur) { lv_draw_rect_shadow_key_t key; diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.h b/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.h index 1e9be34..c3262d5 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.h +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_rect.h @@ -57,7 +57,36 @@ typedef struct lv_draw_sdl_rect_header_t { * Other functions *====================*/ -SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius); +/** + * + * @param ctx Drawing context + * @param radius Corner radius of the rectangle + * @param in_cache Whether the texture has been put in the cache + * @return Background fragment texture + */ +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius, bool * in_cache); + +/** + * + * @param ctx Drawing context + * @param grad Gradient info + * @param w Width of the rectangle + * @param h Height of the rectangle + * @param radius Corner radius of the rectangle + * @param in_cache Whether the texture has been put in the cache + * @return Gradient fragment texture + */ +SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, lv_coord_t w, + lv_coord_t h, lv_coord_t radius, bool * in_cache); + +/** + * + * @param ctx Drawing context + * @param grad Gradient info + * @param in_cache Whether the texture has been put in the cache + * @return Gradient strip texture + */ +SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, bool * in_cache); void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture * frag, lv_coord_t frag_size, const lv_area_t * coords, const lv_area_t * clip, bool full); diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c b/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c index 6845add..4067417 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c @@ -81,12 +81,12 @@ SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ct return value->texture; } -void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) +bool lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) { - lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); + return lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); } -void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, +bool lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture, void * userdata, void userdata_free(void *), lv_draw_sdl_cache_flag_t flags) { @@ -97,22 +97,20 @@ void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void value->userdata_free = userdata_free; value->flags = flags; if(!texture) { - lv_lru_set(lru, key, key_length, value, 1); - return; + return lv_lru_set(lru, key, key_length, value, 1) == LV_LRU_OK; } if(flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) { /* Managed texture doesn't count into cache size */ LV_LOG_INFO("cache texture %p", texture); - lv_lru_set(lru, key, key_length, value, 1); - return; + return lv_lru_set(lru, key, key_length, value, 1) == LV_LRU_OK; } Uint32 format; int access, width, height; if(SDL_QueryTexture(texture, &format, &access, &width, &height) != 0) { - return; + return false; } LV_LOG_INFO("cache texture %p, %d*%d@%dbpp", texture, width, height, SDL_BITSPERPIXEL(format)); - lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8); + return lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8) == LV_LRU_OK; } lv_draw_sdl_cache_key_head_img_t * lv_draw_sdl_texture_img_key_create(const void * src, int32_t frame_id, size_t * size) diff --git a/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h b/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h index dc8b578..3a799f5 100644 --- a/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h +++ b/lib/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h @@ -50,6 +50,7 @@ typedef enum { LV_GPU_CACHE_KEY_MAGIC_RECT_BG = 0x31, LV_GPU_CACHE_KEY_MAGIC_RECT_SHADOW = 0x32, LV_GPU_CACHE_KEY_MAGIC_RECT_BORDER = 0x33, + LV_GPU_CACHE_KEY_MAGIC_RECT_GRAD = 0x34, LV_GPU_CACHE_KEY_MAGIC_FONT_GLYPH = 0x41, LV_GPU_CACHE_KEY_MAGIC_MASK = 0x51, } lv_sdl_cache_key_magic_t; @@ -81,9 +82,15 @@ SDL_Texture * lv_draw_sdl_texture_cache_get(lv_draw_sdl_ctx_t * ctx, const void SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, bool * found, void ** userdata); -void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); +/** + * @return Whether the texture has been put in the cache + */ +bool lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); -void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, +/** + * @return Whether the texture has been put in the cache + */ +bool lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture, void * userdata, void userdata_free(void *), lv_draw_sdl_cache_flag_t flags); diff --git a/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c index 4eb1940..84da4b6 100644 --- a/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c +++ b/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c @@ -11,100 +11,125 @@ #if LV_USE_GPU_STM32_DMA2D -#include LV_GPU_DMA2D_CMSIS_INCLUDE - /********************* * DEFINES *********************/ - #if LV_COLOR_16_SWAP - // TODO: F7 has red blue swap bit in control register for all layers and output - #error "Can't use DMA2D with LV_COLOR_16_SWAP 1" + // Note: DMA2D red/blue swap (RBS) works for all color modes + #define RBS_BIT 1U +#else + #define RBS_BIT 0U #endif -#if LV_COLOR_DEPTH == 8 - #error "Can't use DMA2D with LV_COLOR_DEPTH == 8" -#endif +#define CACHE_ROW_SIZE 32U // cache row size in Bytes + +// For code/implementation discussion refer to https://github.com/lvgl/lvgl/issues/3714#issuecomment-1365187036 +// astyle --options=lvgl/scripts/code-format.cfg --ignore-exclude-errors lvgl/src/draw/stm32_dma2d/*.c lvgl/src/draw/stm32_dma2d/*.h #if LV_COLOR_DEPTH == 16 - #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_RGB565 + const dma2d_color_format_t LvglColorFormat = RGB565; #elif LV_COLOR_DEPTH == 32 - #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_ARGB8888 + const dma2d_color_format_t LvglColorFormat = ARGB8888; #else - /*Can't use GPU with other formats*/ + #error "Cannot use DMA2D with LV_COLOR_DEPTH other than 16 or 32" #endif -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_draw_stm32_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color); - - -static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa); - -static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); - +#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + #define LV_STM32_DMA2D_USE_M7_CACHE +#endif -static void invalidate_cache(void); +#if defined (LV_STM32_DMA2D_USE_M7_CACHE) + // Cortex-M7 DCache present + #define __lv_gpu_stm32_dma2d_clean_cache(address, offset, width, height, pixel_size) _lv_gpu_stm32_dma2d_clean_cache(address, offset, width, height, pixel_size) + #define __lv_gpu_stm32_dma2d_invalidate_cache(address, offset, width, height, pixel_size) _lv_gpu_stm32_dma2d_invalidate_cache(address, offset, width, height, pixel_size) +#else + #define __lv_gpu_stm32_dma2d_clean_cache(address, offset, width, height, pixel_size) + #define __lv_gpu_stm32_dma2d_invalidate_cache(address, offset, width, height, pixel_size) +#endif /********************** - * STATIC VARIABLES + * STATIC PROTOTYPES **********************/ +static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format); +static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format); +static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2); + +LV_STM32_DMA2D_STATIC void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); +LV_STM32_DMA2D_STATIC lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * src_area, const void * src); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dst_buf, lv_coord_t dst_stride, + const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa, + dma2d_color_format_t src_color_format, bool ignore_src_alpha); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dst_buf, lv_coord_t dst_stride, + const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset, + lv_color_t color, lv_opa_t opa); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void); + +#if defined (LV_STM32_DMA2D_USE_M7_CACHE) +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset, + lv_coord_t width, lv_coord_t height, uint8_t pixel_size); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size); +#endif -/********************** - * MACROS - **********************/ +#if defined(LV_STM32_DMA2D_TEST) + LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void); + LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void); + LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void); +#endif -/********************** - * GLOBAL FUNCTIONS - **********************/ +static bool isDma2dInProgess = false; // indicates whether DMA2D transfer *initiated here* is in progress /** * Turn on the peripheral and set output color mode, this only needs to be done once */ void lv_draw_stm32_dma2d_init(void) { - /*Enable DMA2D clock*/ -#if defined(STM32F4) || defined(STM32F7) - RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; + // Enable DMA2D clock +#if defined(STM32F4) || defined(STM32F7) || defined(STM32U5) + RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; // enable DMA2D + // wait for hardware access to complete + __asm volatile("DSB\n"); + volatile uint32_t temp = RCC->AHB1ENR; + LV_UNUSED(temp); #elif defined(STM32H7) RCC->AHB3ENR |= RCC_AHB3ENR_DMA2DEN; + // wait for hardware access to complete + __asm volatile("DSB\n"); + volatile uint32_t temp = RCC->AHB3ENR; + LV_UNUSED(temp); #else # warning "LVGL can't enable the clock of DMA2D" #endif - - /*Wait for hardware access to complete*/ - __asm volatile("DSB\n"); - - /*Delay after setting peripheral clock*/ - volatile uint32_t temp = RCC->AHB1ENR; - LV_UNUSED(temp); - - /*set output colour mode*/ - DMA2D->OPFCCR = LV_DMA2D_COLOR_FORMAT; + // AHB master timer configuration + DMA2D->AMTCR = 0; // AHB bus guaranteed dead time disabled +#if defined(LV_STM32_DMA2D_TEST) + _lv_gpu_stm32_dwt_init(); // init µs timer +#endif } - void lv_draw_stm32_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) { - lv_draw_sw_init_ctx(drv, draw_ctx); lv_draw_stm32_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; dma2d_draw_ctx->blend = lv_draw_stm32_dma2d_blend; - // dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_stm32_dma2d_img_decoded; - dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_stm32_dma2d_wait_cb; + dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_stm32_dma2d_img_decoded; + //dma2d_draw_ctx->base_draw.draw_img = lv_draw_stm32_dma2d_img; + // Note: currently it does not make sense use lv_gpu_stm32_dma2d_wait_cb() since waiting starts right after the dma2d transfer + //dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_stm32_dma2d_wait_cb; dma2d_draw_ctx->base_draw.buffer_copy = lv_draw_stm32_dma2d_buffer_copy; - } void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) @@ -113,153 +138,659 @@ void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ct LV_UNUSED(draw_ctx); } - -void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) { - lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; - - bool done = false; - - if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + if(dsc->blend_mode != LV_BLEND_MODE_NORMAL) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + // Note: x1 must be zero. Otherwise, there is no way to correctly calculate dest_stride. + //LV_ASSERT_MSG(draw_ctx->buf_area->x1 == 0); // critical? + // Both draw buffer start address and buffer size *must* be 32-byte aligned since draw buffer cache is being invalidated. + //uint32_t drawBufferLength = lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(drawBufferLength % CACHE_ROW_SIZE == 0); // critical, but this is not the way to test it + //LV_ASSERT_MSG((uint32_t)draw_ctx->buf % CACHE_ROW_SIZE == 0, "draw_ctx.buf is not 32B aligned"); // critical? + + if(dsc->src_buf) { + // For performance reasons, both source buffer start address and buffer size *should* be 32-byte aligned since source buffer cache is being cleaned. + //uint32_t srcBufferLength = lv_area_get_size(dsc->blend_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(srcBufferLength % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + //LV_ASSERT_MSG((uint32_t)dsc->src_buf % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + } - lv_color_t * dest_buf = draw_ctx->buf; - dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); - - const lv_color_t * src_buf = dsc->src_buf; - if(src_buf) { - lv_draw_sw_blend_basic(draw_ctx, dsc); - lv_coord_t src_stride; - src_stride = lv_area_get_width(dsc->blend_area); - src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1); - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - lv_draw_stm32_dma2d_blend_map(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa); - done = true; + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, dsc->blend_area, draw_ctx->clip_area)) return; + // + draw_ctx->buf_area has the entire draw buffer location + // + draw_ctx->clip_area has the current draw buffer location + // + dsc->blend_area has the location of the area intended to be painted - image etc. + // + draw_area has the area actually being painted + // All coordinates are relative to the screen. + + const lv_opa_t * mask = dsc->mask_buf; + + if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; + else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; + + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + if(mask != NULL) { + // For performance reasons, both mask buffer start address and buffer size *should* be 32-byte aligned since mask buffer cache is being cleaned. + //uint32_t srcBufferLength = lv_area_get_size(dsc->mask_area) * sizeof(lv_opa_t); + //LV_ASSERT_MSG(srcBufferLength % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + //LV_ASSERT_MSG((uint32_t)mask % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + + lv_coord_t mask_stride = lv_area_get_width(dsc->mask_area); + lv_point_t mask_offset = lv_area_get_offset(dsc->mask_area, &draw_area); // mask offset in relation to draw_area + + if(dsc->src_buf == NULL) { // 93.5% + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + _lv_draw_stm32_dma2d_blend_paint(draw_ctx->buf, dest_stride, &draw_area, mask, mask_stride, &mask_offset, dsc->color, + dsc->opa); } - else if(dsc->opa >= LV_OPA_MAX) { - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - lv_draw_stm32_dma2d_blend_fill(dest_buf, dest_stride, &blend_area, dsc->color); - done = true; + else { // 0.2% + // note: (x)RGB dsc->src_buf does not carry alpha channel bytes, + // alpha channel bytes are carried in dsc->mask_buf +#if LV_COLOR_DEPTH == 32 + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + lv_point_t src_offset = lv_area_get_offset(dsc->blend_area, &draw_area); // source image offset in relation to draw_area + lv_coord_t draw_width = lv_area_get_width(&draw_area); + lv_coord_t draw_height = lv_area_get_height(&draw_area); + + // merge mask alpha bytes with src RGB bytes + // TODO: optimize by reading 4 or 8 mask bytes at a time + mask += (mask_stride * mask_offset.y) + mask_offset.x; + lv_color_t * src_buf = (lv_color_t *)dsc->src_buf; + src_buf += (src_stride * src_offset.y) + src_offset.x; + uint16_t mask_buffer_offset = mask_stride - draw_width; + uint16_t src_buffer_offset = src_stride - draw_width; + while(draw_height > 0) { + draw_height--; + for(uint16_t x = 0; x < draw_width; x++) { + (*src_buf).ch.alpha = *mask; + src_buf++; + mask++; + } + mask += mask_buffer_offset; + src_buf += src_buffer_offset; + } + + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, + -draw_ctx->buf_area->y1); // translate the screen draw area to the origin of the buffer area + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, dsc->src_buf, src_stride, &src_offset, dsc->opa, + ARGB8888, false); +#else + // Note: 16-bit bitmap hardware blending with mask and background is possible, but requires a temp 24 or 32-bit buffer to combine bitmap with mask first. + + lv_draw_sw_blend_basic(draw_ctx, dsc); // (e.g. Shop Items) + // clean cache after software drawing - this does not help since this is not the only place where buffer is written without dma2d + // lv_coord_t draw_width = lv_area_get_width(&draw_area); + // lv_coord_t draw_height = lv_area_get_height(&draw_area); + // uint32_t dest_address = (uint32_t)(draw_ctx->buf + (dest_stride * draw_area.y1) + draw_area.x1); + // __lv_gpu_stm32_dma2d_clean_cache(dest_address, dest_stride - draw_width, draw_width, draw_height, sizeof(lv_color_t)); +#endif + } + } + else { + if(dsc->src_buf == NULL) { // 6.1% + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, + -draw_ctx->buf_area->y1); // translate the screen draw area to the origin of the buffer area + _lv_draw_stm32_dma2d_blend_fill(draw_ctx->buf, dest_stride, &draw_area, dsc->color, dsc->opa); + } + else { // 0.2% + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + lv_point_t src_offset = lv_area_get_offset(dsc->blend_area, &draw_area); // source image offset in relation to draw_area + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, + -draw_ctx->buf_area->y1); // translate the screen draw area to the origin of the buffer area + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, dsc->src_buf, src_stride, &src_offset, dsc->opa, + LvglColorFormat, true); } } - - if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); } -void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, - void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, - void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +// Does dest_area = intersect(draw_ctx->clip_area, src_area) ? +// See: https://github.com/lvgl/lvgl/issues/3714#issuecomment-1331710788 +static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, void * dest_buf, lv_coord_t dest_stride, + const lv_area_t * dest_area, void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) { + // Both draw buffer start address and buffer size *must* be 32-byte aligned since draw buffer cache is being invalidated. + //uint32_t drawBufferLength = lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(drawBufferLength % CACHE_ROW_SIZE == 0); // critical, but this is not the way to test it + //LV_ASSERT_MSG((uint32_t)draw_ctx->buf % CACHE_ROW_SIZE == 0, "draw_ctx.buf is not 32B aligned"); // critical? + // FIXME: + // 1. Both src_buf and dest_buf pixel size *must* be known to use DMA2D. + // 2. Verify both buffers start addresses and lengths are 32-byte (cache row size) aligned. LV_UNUSED(draw_ctx); - lv_draw_stm32_dma2d_blend_map(dest_buf, dest_area, dest_stride, src_buf, src_stride, LV_OPA_MAX); + lv_point_t src_offset = lv_area_get_offset(src_area, dest_area); + // FIXME: use lv_area_move(dest_area, -dest_area->x1, -dest_area->y1) here ? + // TODO: It is assumed that dest_buf and src_buf buffers are of lv_color_t type. Verify it, this assumption may be incorrect. + _lv_draw_stm32_dma2d_blend_map((const lv_color_t *)dest_buf, dest_stride, dest_area, (const lv_color_t *)src_buf, + src_stride, &src_offset, 0xff, LvglColorFormat, true); + // TODO: Investigate if output buffer cache needs to be invalidated. It depends on what the destination buffer is and how it is used next - by dma2d or not. + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); // TODO: is this line needed here? } - -static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format) { - /*TODO basic ARGB8888 image can be handles here*/ + if(draw_ctx->draw_img_decoded == NULL) return; + lv_area_t draw_area; + lv_area_copy(&draw_area, draw_ctx->clip_area); - lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); + bool mask_any = lv_draw_mask_is_any(&draw_area); + bool transform = img_dsc->angle != 0 || img_dsc->zoom != LV_IMG_ZOOM_NONE; + const dma2d_color_format_t bitmapColorFormat = lv_color_format_to_dma2d_color_format(color_format); + const bool ignoreBitmapAlpha = (color_format == LV_IMG_CF_RGBX8888); + + if(!mask_any && !transform && bitmapColorFormat != UNSUPPORTED && img_dsc->recolor_opa == LV_OPA_TRANSP) { + // simple bitmap blending, optionally with supported color format conversion - handle directly by dma2d + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + lv_coord_t src_stride = lv_area_get_width(coords); + lv_point_t src_offset = lv_area_get_offset(coords, &draw_area); // source image offset in relation to draw_area + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, src_buf, src_stride, &src_offset, + img_dsc->opa, bitmapColorFormat, ignoreBitmapAlpha); + } + else { + // all more complex cases which require additional image transformations + lv_draw_sw_img_decoded(draw_ctx, img_dsc, coords, src_buf, color_format); + + } } -static void lv_draw_stm32_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color) +static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2) { - /*Simply fill an area*/ - int32_t area_w = lv_area_get_width(fill_area); - int32_t area_h = lv_area_get_height(fill_area); - invalidate_cache(); + lv_point_t offset = {x: area2->x1 - area1->x1, y: area2->y1 - area1->y1}; + return offset; +} - DMA2D->CR = 0x30000; - DMA2D->OMAR = (uint32_t)dest_buf; - /*as input color mode is same as output we don't need to convert here do we?*/ - DMA2D->OCOLR = color.full; - DMA2D->OOR = dest_stride - area_w; - DMA2D->NLR = (area_w << DMA2D_NLR_PL_Pos) | (area_h << DMA2D_NLR_NL_Pos); +static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format) +{ + switch(color_format) { + case LV_IMG_CF_RGBA8888: + // note: LV_IMG_CF_RGBA8888 is actually ARGB8888 + return ARGB8888; + case LV_IMG_CF_RGBX8888: + // note: LV_IMG_CF_RGBX8888 is actually XRGB8888 + return ARGB8888; + case LV_IMG_CF_RGB565: + return RGB565; + case LV_IMG_CF_TRUE_COLOR: + return LvglColorFormat; + case LV_IMG_CF_TRUE_COLOR_ALPHA: +#if LV_COLOR_DEPTH == 16 + // bitmap color format is 24b ARGB8565 - dma2d unsupported + return UNSUPPORTED; +#elif LV_COLOR_DEPTH == 32 + return ARGB8888; +#else + // unknown bitmap color format + return UNSUPPORTED; +#endif + default: + return UNSUPPORTED; + } +} - /*start transfer*/ - DMA2D->CR |= DMA2D_CR_START_Msk; +LV_STM32_DMA2D_STATIC lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * src_area, const void * src) +{ + //if(lv_img_src_get_type(src) != LV_IMG_SRC_VARIABLE) return LV_RES_INV; + return LV_RES_INV; + if(img_dsc->opa <= LV_OPA_MIN) return LV_RES_OK; + const lv_img_dsc_t * img = src; + const dma2d_color_format_t bitmapColorFormat = lv_color_format_to_dma2d_color_format(img->header.cf); + const bool ignoreBitmapAlpha = (img->header.cf == LV_IMG_CF_RGBX8888); + + if(bitmapColorFormat == UNSUPPORTED || img_dsc->angle != 0 || img_dsc->zoom != LV_IMG_ZOOM_NONE) { + return LV_RES_INV; // sorry, dma2d can handle this + } + // FIXME: handle dsc.pivot, dsc.recolor, dsc.blend_mode + // FIXME: src pixel size *must* be known to use DMA2D + // FIXME: If image is drawn by SW, then output cache needs to be cleaned next. Currently it is not possible. + // Both draw buffer start address and buffer size *must* be 32-byte aligned since draw buffer cache is being invalidated. + //uint32_t drawBufferLength = lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(drawBufferLength % CACHE_ROW_SIZE == 0); // critical, but this is not the way to test it + //LV_ASSERT_MSG((uint32_t)draw_ctx->buf % CACHE_ROW_SIZE == 0, "draw_ctx.buf is not 32B aligned"); // critical? + + // For performance reasons, both source buffer start address and buffer size *should* be 32-byte aligned since source buffer cache is being cleaned. + //uint32_t srcBufferLength = lv_area_get_size(src_area) * sizeof(lv_color_t); // TODO: verify src pixel size = sizeof(lv_color_t) + //LV_ASSERT_MSG(srcBufferLength % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + //LV_ASSERT_MSG((uint32_t)src % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, src_area, draw_ctx->clip_area)) return LV_RES_OK; + + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + lv_point_t src_offset = lv_area_get_offset(src_area, &draw_area); // source image offset in relation to draw_area + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, img->data, img->header.w, + &src_offset, img_dsc->opa, bitmapColorFormat, ignoreBitmapAlpha); + return LV_RES_OK; } +LV_STM32_DMA2D_STATIC void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(disp->driver); + lv_draw_sw_wait_for_finish(draw_ctx); +} -static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa) +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * @brief Fills draw_area with specified color. + * @param color color to be painted, note: alpha is ignored + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa) { + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); - /*Simple copy*/ - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); - invalidate_cache(); if(opa >= LV_OPA_MAX) { - DMA2D->CR = 0; - /*copy output colour mode, this register controls both input and output colour format*/ - DMA2D->FGPFCCR = LV_DMA2D_COLOR_FORMAT; - DMA2D->FGMAR = (uint32_t)src_buf; - DMA2D->FGOR = src_stride - dest_w; - DMA2D->OMAR = (uint32_t)dest_buf; - DMA2D->OOR = dest_stride - dest_w; - DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos); - - /*start transfer*/ - DMA2D->CR |= DMA2D_CR_START_Msk; + DMA2D->CR = 0x3UL << DMA2D_CR_MODE_Pos; // Register-to-memory (no FG nor BG, only output stage active) + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->OOR = dest_stride - draw_width; // out buffer offset + // Note: unlike FGCOLR and BGCOLR, OCOLR bits must match DMA2D_OUTPUT_COLOR, alpha can be specified +#if RBS_BIT + // swap red/blue bits + DMA2D->OCOLR = (color.ch.blue << 11) | (color.ch.green_l << 5 | color.ch.green_h << 8) | (color.ch.red); +#else + DMA2D->OCOLR = color.full; +#endif } else { - DMA2D->CR = 0x20000; - - DMA2D->BGPFCCR = LV_DMA2D_COLOR_FORMAT; - DMA2D->BGMAR = (uint32_t)dest_buf; - DMA2D->BGOR = dest_stride - dest_w; - - DMA2D->FGPFCCR = (uint32_t)LV_DMA2D_COLOR_FORMAT - /*alpha mode 2, replace with foreground * alpha value*/ - | (2 << DMA2D_FGPFCCR_AM_Pos) - /*alpha value*/ - | (opa << DMA2D_FGPFCCR_ALPHA_Pos); - DMA2D->FGMAR = (uint32_t)src_buf; - DMA2D->FGOR = src_stride - dest_w; - - DMA2D->OMAR = (uint32_t)dest_buf; - DMA2D->OOR = dest_stride - dest_w; - DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos); - - /*start transfer*/ - DMA2D->CR |= DMA2D_CR_START_Msk; + DMA2D->CR = 0x2UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with blending (FG and BG fetch with PFC and blending) + + DMA2D->FGPFCCR = A8; + DMA2D->FGPFCCR |= (opa << DMA2D_FGPFCCR_ALPHA_Pos); + // Alpha Mode 1: Replace original foreground image alpha channel value by FGPFCCR.ALPHA + DMA2D->FGPFCCR |= (0x1UL << DMA2D_FGPFCCR_AM_Pos); + //DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); + + // Note: in Alpha Mode 1 FGMAR and FGOR are not used to supply foreground A8 bytes, + // those bytes are replaced by constant ALPHA defined in FGPFCCR + DMA2D->FGMAR = (uint32_t)dest_buf; + DMA2D->FGOR = dest_stride; + DMA2D->FGCOLR = lv_color_to32(color) & 0x00ffffff; // swap FGCOLR R/B bits if FGPFCCR.RBS (RBS_BIT) bit is set + + DMA2D->BGPFCCR = LvglColorFormat; +#if defined(DMA2D_BGPFCCR_RBS_Pos) + DMA2D->BGPFCCR |= (RBS_BIT << DMA2D_BGPFCCR_RBS_Pos); +#endif + DMA2D->BGMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->BGOR = dest_stride - draw_width; + DMA2D->BGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->BGMAR, DMA2D->BGOR, draw_width, draw_height, sizeof(lv_color_t)); + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = DMA2D->BGMAR; + DMA2D->OOR = DMA2D->BGOR; + DMA2D->OCOLR = 0; } + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); } -void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) +/** + * @brief Draws src (foreground) map on dst (background) map. + * @param src_offset src offset in relation to dst, useful when src is larger than draw_area + * @param opa constant opacity to be applied + * @param bitmapColorCode bitmap color type + * @param ignoreAlpha if TRUE, bitmap src alpha channel is ignored + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa, + dma2d_color_format_t src_color_format, bool ignore_src_alpha) { - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - if(disp->driver && disp->driver->wait_cb) { - while(DMA2D->CR & DMA2D_CR_START_Msk) { - disp->driver->wait_cb(disp->driver); + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + if(opa <= LV_OPA_MIN || src_color_format == UNSUPPORTED) return; + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + bool bitmapHasOpacity = !ignore_src_alpha && (src_color_format == ARGB8888 || src_color_format == ARGB1555 || + src_color_format == ARGB4444); + + if(opa >= LV_OPA_MAX) opa = 0xff; + + uint8_t srcBpp; // source bytes per pixel + switch(src_color_format) { + case ARGB8888: + srcBpp = 4; + break; + case RGB888: + srcBpp = 3; + break; + case RGB565: + case ARGB1555: + case ARGB4444: + srcBpp = 2; + break; + default: + LV_LOG_ERROR("unsupported color format"); + return; + } + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + DMA2D->FGPFCCR = src_color_format; + + if(opa == 0xff && !bitmapHasOpacity) { + // no need to blend + if(src_color_format == LvglColorFormat) { + // no need to convert pixel format (PFC) either + DMA2D->CR = 0x0UL; + } + else { + DMA2D->CR = 0x1UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with PFC (FG fetch only with FG PFC active) } + // Alpha Mode 0: No modification of the foreground image alpha channel value } else { - while(DMA2D->CR & DMA2D_CR_START_Msk); + // blend + DMA2D->CR = 0x2UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with blending (FG and BG fetch with PFC and blending) + DMA2D->FGPFCCR |= (opa << DMA2D_FGPFCCR_ALPHA_Pos); + if(bitmapHasOpacity) { + // Alpha Mode 2: Replace original foreground image alpha channel value by FGPFCCR.ALPHA multiplied with original alpha channel value + DMA2D->FGPFCCR |= (0x2UL << DMA2D_FGPFCCR_AM_Pos); + } + else { + // Alpha Mode 1: Replace original foreground image alpha channel value by FGPFCCR.ALPHA + DMA2D->FGPFCCR |= (0x1UL << DMA2D_FGPFCCR_AM_Pos); + } } - lv_draw_sw_wait_for_finish(draw_ctx); +#if defined(DMA2D_FGPFCCR_RBS_Pos) + DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); +#endif + DMA2D->FGMAR = ((uint32_t)src_buf) + srcBpp * ((src_stride * src_offset->y) + src_offset->x); + DMA2D->FGOR = src_stride - draw_width; + DMA2D->FGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->FGMAR, DMA2D->FGOR, draw_width, draw_height, srcBpp); + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->OOR = dest_stride - draw_width; + DMA2D->OCOLR = 0; + + if(opa != 0xff || bitmapHasOpacity) { + // use background (BG*) registers + DMA2D->BGPFCCR = LvglColorFormat; +#if defined(DMA2D_BGPFCCR_RBS_Pos) + DMA2D->BGPFCCR |= (RBS_BIT << DMA2D_BGPFCCR_RBS_Pos); +#endif + DMA2D->BGMAR = DMA2D->OMAR; + DMA2D->BGOR = DMA2D->OOR; + DMA2D->BGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->BGMAR, DMA2D->BGOR, draw_width, draw_height, sizeof(lv_color_t)); + } + + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + _lv_gpu_stm32_dma2d_start_dma_transfer(); } -/********************** - * STATIC FUNCTIONS - **********************/ +/** + * @brief Paints solid color with alpha mask with additional constant opacity. Useful e.g. for painting anti-aliased fonts. + * @param src_offset src offset in relation to dst, useful when src (alpha mask) is larger than draw_area + * @param color color to paint, note: alpha is ignored + * @param opa constant opacity to be applied + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset, + lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + DMA2D->CR = 0x2UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with blending (FG and BG fetch with PFC and blending) -static void invalidate_cache(void) + DMA2D->FGPFCCR = A8; + if(opa < LV_OPA_MAX) { + DMA2D->FGPFCCR |= (opa << DMA2D_FGPFCCR_ALPHA_Pos); + DMA2D->FGPFCCR |= (0x2UL << + DMA2D_FGPFCCR_AM_Pos); // Alpha Mode: Replace original foreground image alpha channel value by FGPFCCR.ALPHA multiplied with original alpha channel value + } + //DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); + DMA2D->FGMAR = (uint32_t)(mask_buf + (mask_stride * mask_offset->y) + mask_offset->x); + DMA2D->FGOR = mask_stride - draw_width; + DMA2D->FGCOLR = lv_color_to32(color) & 0x00ffffff; // swap FGCOLR R/B bits if FGPFCCR.RBS (RBS_BIT) bit is set + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->FGMAR, DMA2D->FGOR, draw_width, draw_height, sizeof(lv_opa_t)); + + DMA2D->BGPFCCR = LvglColorFormat; +#if defined(DMA2D_BGPFCCR_RBS_Pos) + DMA2D->BGPFCCR |= (RBS_BIT << DMA2D_BGPFCCR_RBS_Pos); +#endif + DMA2D->BGMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->BGOR = dest_stride - draw_width; + DMA2D->BGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->BGMAR, DMA2D->BGOR, draw_width, draw_height, sizeof(lv_color_t)); + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = DMA2D->BGMAR; + DMA2D->OOR = DMA2D->BGOR; + DMA2D->OCOLR = 0; + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); +} + +/** + * @brief Copies src (foreground) map to the dst (background) map. + * @param src_offset src offset in relation to dst, useful when src is larger than draw_area + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset) { - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); - else { -#if __CORTEX_M >= 0x07 - if((SCB->CCR) & (uint32_t)SCB_CCR_DC_Msk) - SCB_CleanInvalidateDCache(); + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + DMA2D->CR = 0x0UL; // Memory-to-memory (FG fetch only) + + DMA2D->FGPFCCR = LvglColorFormat; +#if defined(DMA2D_FGPFCCR_RBS_Pos) + DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); +#endif + DMA2D->FGMAR = (uint32_t)(src_buf + (src_stride * src_offset->y) + src_offset->x); + DMA2D->FGOR = src_stride - draw_width; + DMA2D->FGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->FGMAR, DMA2D->FGOR, draw_width, draw_height, sizeof(lv_color_t)); + + // Note BG* registers do not need to be set up since BG is not used + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->OOR = dest_stride - draw_width; + DMA2D->OCOLR = 0; + + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); +} + +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); + isDma2dInProgess = true; + DMA2D->IFCR = 0x3FU; // trigger ISR flags reset + // Note: cleaning output buffer cache is needed only when buffer may be misaligned or adjacent area may have been drawn in sw-fashion, e.g. using lv_draw_sw_blend_basic() +#if LV_COLOR_DEPTH == 16 + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->OMAR, DMA2D->OOR, (DMA2D->NLR & DMA2D_NLR_PL_Msk) >> DMA2D_NLR_PL_Pos, + (DMA2D->NLR & DMA2D_NLR_NL_Msk) >> DMA2D_NLR_NL_Pos, sizeof(lv_color_t)); #endif + DMA2D->CR |= DMA2D_CR_START; + // Note: for some reason mask buffer gets damaged during transfer if waiting is postponed + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); // FIXME: this line should not be needed here, but it is +} + +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv) +{ + if(disp_drv && disp_drv->wait_cb) { + while((DMA2D->CR & DMA2D_CR_START) != 0U) { + disp_drv->wait_cb(disp_drv); + } + } + else { + while((DMA2D->CR & DMA2D_CR_START) != 0U); + } + + __IO uint32_t isrFlags = DMA2D->ISR; + + if(isrFlags & DMA2D_ISR_CEIF) { + LV_LOG_ERROR("DMA2D config error"); + } + + if(isrFlags & DMA2D_ISR_TEIF) { + LV_LOG_ERROR("DMA2D transfer error"); + } + + DMA2D->IFCR = 0x3FU; // trigger ISR flags reset + + if(isDma2dInProgess) { + // invalidate output buffer cached memory ONLY after DMA2D transfer + //__lv_gpu_stm32_dma2d_invalidate_cache(DMA2D->OMAR, DMA2D->OOR, (DMA2D->NLR & DMA2D_NLR_PL_Msk) >> DMA2D_NLR_PL_Pos, (DMA2D->NLR & DMA2D_NLR_NL_Msk) >> DMA2D_NLR_NL_Pos, sizeof(lv_color_t)); + isDma2dInProgess = false; } } +#if defined (LV_STM32_DMA2D_USE_M7_CACHE) +// Cortex-M7 DCache present +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size) +{ + if(((SCB->CCR) & SCB_CCR_DC_Msk) == 0) return; // L1 data cache is disabled + uint16_t stride = pixel_size * (width + offset); // in bytes + uint16_t ll = pixel_size * width; // line length in bytes + uint32_t n = 0; // address of the next cache row after the last invalidated row + lv_coord_t h = 0; + + __DSB(); + + while(h < height) { + uint32_t a = address + (h * stride); + uint32_t e = a + ll; // end address, address of the first byte after the current line + a &= ~(CACHE_ROW_SIZE - 1U); + if(a < n) a = n; // prevent the previous last cache row from being invalidated again + + while(a < e) { + SCB->DCIMVAC = a; + a += CACHE_ROW_SIZE; + } + + n = a; + h++; + }; + + __DSB(); + __ISB(); +} + +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size) +{ + if(((SCB->CCR) & SCB_CCR_DC_Msk) == 0) return; // L1 data cache is disabled + uint16_t stride = pixel_size * (width + offset); // in bytes + uint16_t ll = pixel_size * width; // line length in bytes + uint32_t n = 0; // address of the next cache row after the last cleaned row + lv_coord_t h = 0; + __DSB(); + + while(h < height) { + uint32_t a = address + (h * stride); + uint32_t e = a + ll; // end address, address of the first byte after the current line + a &= ~(CACHE_ROW_SIZE - 1U); + if(a < n) a = n; // prevent the previous last cache row from being cleaned again + + while(a < e) { + SCB->DCCMVAC = a; + a += CACHE_ROW_SIZE; + } + + n = a; + h++; + }; + + __DSB(); + __ISB(); +} +#endif // LV_STM32_DMA2D_USE_M7_CACHE + +#if defined(LV_STM32_DMA2D_TEST) +// initialize µs timer +LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void) +{ + // disable TRC + CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; + // enable TRC + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + +#if defined(__CORTEX_M) && (__CORTEX_M == 7U) + DWT->LAR = 0xC5ACCE55; #endif + // disable clock cycle counter + DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; + // enable clock cycle counter + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + + // reset the clock cycle counter value + DWT->CYCCNT = 0; + + // 3 NO OPERATION instructions + __ASM volatile("NOP"); + __ASM volatile("NOP"); + __ASM volatile("NOP"); + + // check if clock cycle counter has started + if(DWT->CYCCNT) { + return true; // clock cycle counter started + } + else { + return false; // clock cycle counter not started + } +} + +// get elapsed µs since reset +LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void) +{ + uint32_t us = (DWT->CYCCNT * 1000000) / HAL_RCC_GetHCLKFreq(); + return us; +} + +// reset µs timer +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void) +{ + DWT->CYCCNT = 0; +} +#endif // LV_STM32_DMA2D_TEST +#endif // LV_USE_GPU_STM32_DMA2D \ No newline at end of file diff --git a/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h index fa7070e..0a97042 100644 --- a/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h +++ b/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h @@ -10,9 +10,6 @@ extern "C" { #endif -/********************* - * INCLUDES - *********************/ #include "../../misc/lv_color.h" #include "../../hal/lv_hal_disp.h" #include "../sw/lv_draw_sw.h" @@ -20,43 +17,43 @@ extern "C" { #if LV_USE_GPU_STM32_DMA2D /********************* - * DEFINES + * INCLUDES *********************/ +#include LV_GPU_DMA2D_CMSIS_INCLUDE -#define LV_DMA2D_ARGB8888 0 -#define LV_DMA2D_RGB888 1 -#define LV_DMA2D_RGB565 2 -#define LV_DMA2D_ARGB1555 3 -#define LV_DMA2D_ARGB4444 4 +/********************* + * DEFINES + *********************/ +#if defined(LV_STM32_DMA2D_TEST) +// removes "static" modifier for some internal methods in order to test them +#define LV_STM32_DMA2D_STATIC +#else +#define LV_STM32_DMA2D_STATIC static +#endif /********************** * TYPEDEFS **********************/ +enum dma2d_color_format { + ARGB8888 = 0x0, + RGB888 = 0x01, + RGB565 = 0x02, + ARGB1555 = 0x03, + ARGB4444 = 0x04, + A8 = 0x09, + UNSUPPORTED = 0xff, +}; +typedef enum dma2d_color_format dma2d_color_format_t; typedef lv_draw_sw_ctx_t lv_draw_stm32_dma2d_ctx_t; - struct _lv_disp_drv_t; /********************** * GLOBAL PROTOTYPES **********************/ - -/** - * Turn on the peripheral and set output color mode, this only needs to be done once - */ void lv_draw_stm32_dma2d_init(void); - void lv_draw_stm32_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); - void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); -void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); - -void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, - void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, - void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); - -void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); - /********************** * MACROS **********************/ diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw.h b/lib/lvgl/src/draw/sw/lv_draw_sw.h index 1618649..0f6d46b 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw.h +++ b/lib/lvgl/src/draw/sw/lv_draw_sw.h @@ -61,11 +61,13 @@ void lv_draw_sw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, con void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter); -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const uint8_t * src_buf, + lv_img_cf_t cf); -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); void lv_draw_sw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t * points, uint16_t point_cnt); diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_blend.c b/lib/lvgl/src/draw/sw/lv_draw_sw_blend.c index 428aba6..a7c4313 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_blend.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_blend.c @@ -26,13 +26,15 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stide); -LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); +static void /* LV_ATTRIBUTE_FAST_MEM */ fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride); #if LV_COLOR_SCREEN_TRANSP -LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); +static void /* LV_ATTRIBUTE_FAST_MEM */ fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride); #endif /*LV_COLOR_SCREEN_TRANSP*/ #if LV_DRAW_COMPLEX @@ -41,15 +43,19 @@ static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_ #endif /*LV_DRAW_COMPLEX*/ static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride); -LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); +static void /* LV_ATTRIBUTE_FAST_MEM */ map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride); #if LV_COLOR_SCREEN_TRANSP -LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, - const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode); +static void /* LV_ATTRIBUTE_FAST_MEM */ map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride, lv_blend_mode_t blend_mode); #endif /*LV_COLOR_SCREEN_TRANSP*/ @@ -101,9 +107,10 @@ void lv_draw_sw_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * d ((lv_draw_sw_ctx_t *)draw_ctx)->blend(draw_ctx, dsc); } -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc) { - const lv_opa_t * mask; + lv_opa_t * mask; if(dsc->mask_buf == NULL) mask = NULL; if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; @@ -129,7 +136,6 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons } } - const lv_color_t * src_buf = dsc->src_buf; lv_coord_t src_stride; if(src_buf) { @@ -142,8 +148,18 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons lv_coord_t mask_stride; if(mask) { + /*Round the values in the mask if anti-aliasing is disabled*/ + if(disp->driver->antialiasing == 0) { + int32_t mask_size = lv_area_get_size(dsc->mask_area); + int32_t i; + for(i = 0; i < mask_size; i++) { + mask[i] = mask[i] > 128 ? LV_OPA_COVER : LV_OPA_TRANSP; + } + } + mask_stride = lv_area_get_width(dsc->mask_area); mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1); + } else { mask_stride = 0; @@ -228,8 +244,9 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_ } } -LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +static LV_ATTRIBUTE_FAST_MEM void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride) { int32_t w = lv_area_get_width(dest_area); int32_t h = lv_area_get_height(dest_area); @@ -421,7 +438,7 @@ static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t o /*Set the result color*/ #if LV_COLOR_DEPTH == 8 - buf[0] = res_color.full; + buf[0] = last_res_color.full; #elif LV_COLOR_DEPTH == 16 buf[0] = last_res_color.full & 0xff; buf[1] = last_res_color.full >> 8; @@ -433,8 +450,9 @@ static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t o } -LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +static void LV_ATTRIBUTE_FAST_MEM fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride) { uint8_t * dest_buf8 = (uint8_t *) dest_buf; int32_t w = lv_area_get_width(dest_area); @@ -590,7 +608,8 @@ static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, #endif static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride) { lv_disp_t * disp = _lv_refr_get_disp_refreshing(); @@ -624,8 +643,10 @@ static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_co } } -LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +static void LV_ATTRIBUTE_FAST_MEM map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride) { int32_t w = lv_area_get_width(dest_area); @@ -720,9 +741,10 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are #if LV_COLOR_SCREEN_TRANSP -LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, - const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode) +static void LV_ATTRIBUTE_FAST_MEM map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride, lv_blend_mode_t blend_mode) { uint8_t * dest_buf8 = (uint8_t *) dest_buf; diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_blend.h b/lib/lvgl/src/draw/sw/lv_draw_sw_blend.h index 9a00e53..3158d98 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_blend.h +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_blend.h @@ -56,7 +56,8 @@ void lv_draw_sw_blend(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_d * @param draw_ctx pointer to a draw context * @param dsc pointer to an initialized blend descriptor */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc); /********************** * MACROS diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_dither.c b/lib/lvgl/src/draw/sw/lv_draw_sw_dither.c index ff9ebf3..68fd2db 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_dither.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_dither.c @@ -17,7 +17,7 @@ #if _DITHER_GRADIENT -LV_ATTRIBUTE_FAST_MEM void lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) { LV_UNUSED(x); LV_UNUSED(y); @@ -40,7 +40,7 @@ static const uint8_t dither_ordered_threshold_matrix[8 * 8] = { }; /* Shift by 6 to normalize */ -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) { LV_UNUSED(x); /* For vertical dithering, the error is spread on the next column (and not next line). @@ -63,7 +63,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, grad->map[j] = lv_color_hex(t.full); } } -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) + +void LV_ATTRIBUTE_FAST_MEM lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) { /* For vertical dithering, the error is spread on the next column (and not next line). Since the renderer is scanline based, it's not obvious what could be used to perform the rendering efficiently. @@ -97,9 +98,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, } } - #if LV_DITHER_ERROR_DIFFUSION == 1 -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) { LV_UNUSED(xs); LV_UNUSED(y); @@ -153,7 +153,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t x grad->map[grad->size - 1] = lv_color_hex(grad->hmap[grad->size - 1].full); } -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) { /* Try to implement error diffusion on a vertical gradient and an horizontal map using those tricks: Since the given hi-resolution gradient (in src) is vertical, the Floyd Steinberg algorithm pass need to be rotated, diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_dither.h b/lib/lvgl/src/draw/sw/lv_draw_sw_dither.h index 6362c5a..17f98f9 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_dither.h +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_dither.h @@ -45,18 +45,19 @@ typedef void (*lv_dither_func_t)(struct _lv_gradient_cache_t * grad, lv_coord_t **********************/ #if LV_DRAW_COMPLEX #if _DITHER_GRADIENT -LV_ATTRIBUTE_FAST_MEM void lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, + lv_coord_t w); -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); #if LV_DITHER_ERROR_DIFFUSION == 1 -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); #endif /* LV_DITHER_ERROR_DIFFUSION */ #endif /* _DITHER_GRADIENT */ diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.c b/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.c index 4e46632..efa158c 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.c @@ -293,7 +293,7 @@ lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h) return item; } -LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, +lv_grad_color_t LV_ATTRIBUTE_FAST_MEM lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, lv_coord_t frac) { lv_grad_color_t tmp; diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.h b/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.h index f5f3215..95a3c4e 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.h +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.h @@ -69,8 +69,8 @@ typedef struct _lv_gradient_cache_t { * @param range The range to use in computation. * @param frac The current part used in the range. frac is in [0; range] */ -LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, - lv_coord_t frac); +lv_grad_color_t /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, + lv_coord_t frac); /** * Set the gradient cache size diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_img.c b/lib/lvgl/src/draw/sw/lv_draw_sw_img.c index 9578bc7..7181c15 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_img.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_img.c @@ -42,8 +42,10 @@ static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coo **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const uint8_t * src_buf, + lv_img_cf_t cf) { /*Use the clip area as draw area*/ lv_area_t draw_area; diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c b/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c index 644012f..b53c662 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c @@ -123,7 +123,6 @@ void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_la img.header.w = lv_area_get_width(draw_ctx->buf_area); img.header.h = lv_area_get_height(draw_ctx->buf_area); img.header.cf = layer_sw_ctx->has_alpha ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR; - lv_img_cache_invalidate_src(&img); /*Restore the original draw_ctx*/ draw_ctx->buf = layer_ctx->original.buf; @@ -135,6 +134,7 @@ void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_la /*Blend the layer*/ lv_draw_img(draw_ctx, draw_dsc, &layer_ctx->area_act, &img); lv_draw_wait_for_finish(draw_ctx); + lv_img_cache_invalidate_src(&img); } void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_letter.c b/lib/lvgl/src/draw/sw/lv_draw_sw_letter.c index 9522888..ee27bc6 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_letter.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_letter.c @@ -27,8 +27,8 @@ * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, - const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p); #if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX @@ -103,7 +103,7 @@ void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc if(letter >= 0x20 && letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ - LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" PRIX32, letter); + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); #if LV_USE_FONT_PLACEHOLDER /* draw placeholder */ @@ -162,7 +162,7 @@ void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc * STATIC FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) { @@ -489,8 +489,8 @@ static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_ #endif #if LV_FONT_SUBPX_BGR - res_color.ch.blue = (uint32_t)((uint32_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8; - res_color.ch.red = (uint32_t)((uint32_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8; + res_color.ch.red = (uint32_t)((uint16_t)txt_rgb[0] * font_rgb[2] + (bg_rgb[0] * (255 - font_rgb[2]))) >> 8; + res_color.ch.blue = (uint32_t)((uint16_t)txt_rgb[2] * font_rgb[0] + (bg_rgb[2] * (255 - font_rgb[0]))) >> 8; #else res_color.ch.red = (uint32_t)((uint16_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8; res_color.ch.blue = (uint32_t)((uint16_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8; diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_line.c b/lib/lvgl/src/draw/sw/lv_draw_sw_line.c index 73833c1..c666891 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_line.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_line.c @@ -23,12 +23,12 @@ * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); -LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); -LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); /********************** * STATIC VARIABLES @@ -49,7 +49,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx * @param clip the line will be drawn only in this area * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { if(dsc->width == 0) return; @@ -109,7 +109,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, con **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { int32_t w = dsc->width - 1; @@ -195,7 +195,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx #endif /*LV_DRAW_COMPLEX*/ } -LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { int32_t w = dsc->width - 1; @@ -275,7 +275,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx #endif /*LV_DRAW_COMPLEX*/ } -LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { #if LV_DRAW_COMPLEX diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_rect.c b/lib/lvgl/src/draw/sw/lv_draw_sw_rect.c index 2b2ea98..a1e620b 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_rect.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_rect.c @@ -35,11 +35,11 @@ static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc static void draw_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); #if LV_DRAW_COMPLEX -LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, - const lv_area_t * coords); -LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t s, - lv_coord_t r); -LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, + lv_coord_t s, lv_coord_t r); +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf); #endif void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, @@ -430,7 +430,7 @@ static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc } #if LV_DRAW_COMPLEX -LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) { /*Check whether the shadow is visible*/ @@ -950,8 +950,8 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv * @param sw shadow width * @param r radius */ -LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t sw, - lv_coord_t r) +static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, + lv_coord_t sw, lv_coord_t r) { int32_t sw_ori = sw; int32_t size = sw_ori + r; @@ -1037,7 +1037,7 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coord } -LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf) +static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf) { int32_t s_left = sw >> 1; int32_t s_right = (sw >> 1); @@ -1159,12 +1159,13 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, bool mask_any = lv_draw_mask_is_any(outer_area); +#if LV_DRAW_COMPLEX + if(!mask_any && rout == 0 && rin == 0) { draw_border_simple(draw_ctx, outer_area, inner_area, color, opa); return; } -#if LV_DRAW_COMPLEX /*Get clipped draw area which is the real draw area. *It is always the same or inside `coords`*/ lv_area_t draw_area; @@ -1281,12 +1282,12 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, /*Draw the corners*/ lv_coord_t blend_w; - /*Left and right corner together is they close to eachother*/ + /*Left and right corner together if they are close to each other*/ if(!split_hor) { /*Calculate the top corner and mirror it to the bottom*/ blend_area.x1 = draw_area.x1; blend_area.x2 = draw_area.x2; - lv_coord_t max_h = LV_MAX(rout, outer_area->y1 - inner_area->y1); + lv_coord_t max_h = LV_MAX(rout, inner_area->y1 - outer_area->y1); for(h = 0; h < max_h; h++) { lv_coord_t top_y = outer_area->y1 + h; lv_coord_t bottom_y = outer_area->y2 - h; @@ -1375,6 +1376,13 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, #else /*LV_DRAW_COMPLEX*/ LV_UNUSED(blend_mode); + LV_UNUSED(rout); + LV_UNUSED(rin); + if(!mask_any) { + draw_border_simple(draw_ctx, outer_area, inner_area, color, opa); + return; + } + #endif /*LV_DRAW_COMPLEX*/ } static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, diff --git a/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c b/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c index 80b1e6d..9ead7b9 100644 --- a/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c +++ b/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c @@ -122,8 +122,8 @@ void lv_draw_sw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, xs_step_256 = (256 * xs_diff) / (dest_w - 1); ys_step_256 = (256 * ys_diff) / (dest_w - 1); } - int32_t xs_ups = xs1_ups; - int32_t ys_ups = ys1_ups; + int32_t xs_ups = xs1_ups + 0x80; + int32_t ys_ups = ys1_ups + 0x80; if(draw_dsc->antialias == 0) { switch(cf) { @@ -180,7 +180,7 @@ static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, l } else { -#if LV_COLOR_DEPTH == 8 +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 const uint8_t * src_tmp = src; src_tmp += ys_int * src_stride + xs_int; cbuf[x].full = src_tmp[0]; @@ -221,7 +221,7 @@ static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, const uint8_t * src_tmp = src; src_tmp += (ys_int * src_stride * LV_IMG_PX_SIZE_ALPHA_BYTE) + xs_int * LV_IMG_PX_SIZE_ALPHA_BYTE; -#if LV_COLOR_DEPTH == 8 +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 cbuf[x].full = src_tmp[0]; #elif LV_COLOR_DEPTH == 16 cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8); @@ -273,7 +273,7 @@ static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t sr int32_t ys_ups_start = ys_ups; bool has_alpha; int32_t px_size; - lv_color_t ck = {0}; + lv_color_t ck = _LV_COLOR_ZERO_INITIALIZER; switch(cf) { case LV_IMG_CF_TRUE_COLOR: has_alpha = false; @@ -396,7 +396,7 @@ static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t sr if(abuf[x] == 0x00) continue; -#if LV_COLOR_DEPTH == 8 +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 c_base.full = px_base[0]; c_ver.full = px_ver[0]; c_hor.full = px_hor[0]; @@ -429,7 +429,7 @@ static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t sr } /*Partially out of the image*/ else { -#if LV_COLOR_DEPTH == 8 +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 cbuf[x].full = src_tmp[0]; #elif LV_COLOR_DEPTH == 16 cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8); diff --git a/lib/lvgl/src/extra/layouts/flex/lv_flex.c b/lib/lvgl/src/extra/layouts/flex/lv_flex.c index 405a56b..8f0b4d2 100644 --- a/lib/lvgl/src/extra/layouts/flex/lv_flex.c +++ b/lib/lvgl/src/extra/layouts/flex/lv_flex.c @@ -97,6 +97,7 @@ void lv_flex_init(void) LV_STYLE_FLEX_MAIN_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); LV_STYLE_FLEX_CROSS_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); LV_STYLE_FLEX_TRACK_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_FLEX_GROW = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); } void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) @@ -470,8 +471,14 @@ static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, i } } - if(f->row) item->w_layout = 1; - else item->h_layout = 1; + if(f->row) { + item->w_layout = 1; + item->h_layout = 0; + } + else { + item->h_layout = 1; + item->w_layout = 0; + } if(s != area_get_main_size(&item->coords)) { lv_obj_invalidate(item); diff --git a/lib/lvgl/src/extra/layouts/flex/lv_flex.h b/lib/lvgl/src/extra/layouts/flex/lv_flex.h index 1499d88..58c3221 100644 --- a/lib/lvgl/src/extra/layouts/flex/lv_flex.h +++ b/lib/lvgl/src/extra/layouts/flex/lv_flex.h @@ -139,7 +139,6 @@ static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, uint32_t return (uint8_t)v.num; } - /********************** * MACROS **********************/ diff --git a/lib/lvgl/src/extra/libs/fsdrv/lv_fs_littlefs.c b/lib/lvgl/src/extra/libs/fsdrv/lv_fs_littlefs.c new file mode 100644 index 0000000..44261c3 --- /dev/null +++ b/lib/lvgl/src/extra/libs/fsdrv/lv_fs_littlefs.c @@ -0,0 +1,332 @@ +/** + * @file lv_fs_littlefs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_LITTLEFS +#include "lfs.h" + +/********************* + * DEFINES + *********************/ + +#if LV_FS_LITTLEFS_LETTER == '\0' + #error "LV_FS_LITTLEFS_LETTER must be an upper case ASCII letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void fs_init(void); + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); + +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); + +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_littlefs_init(void) +{ + /*---------------------------------------------------- + * Initialize your storage device and File System + * -------------------------------------------------*/ + fs_init(); + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple drive to open images*/ + static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_LITTLEFS_LETTER; + fs_drv.cache_size = LV_FS_LITTLEFS_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_read_cb = fs_dir_read; + + /*#if LV_USE_USER_DATA*/ + fs_drv.user_data = NULL; + /*#endif*/ + + lv_fs_drv_register(&fs_drv); +} + +/** + * Convenience function to attach registered driver to lfs_t structure by driver-label + * @param label the label assigned to the driver when it was registered + * @param lfs_p the pointer to the lfs_t structure initialized by external code/library + * @return pointer to a driver descriptor or NULL on error + */ +lv_fs_drv_t * lv_fs_littlefs_set_driver(char label, void * lfs_p) +{ + lv_fs_drv_t * drv_p = lv_fs_get_drv(label); + if(drv_p != NULL) drv_p->user_data = (lfs_t *) lfs_p; + return drv_p; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + /* Initialize the internal flash or SD-card and LittleFS itself. + * Better to do it in your code to keep this library untouched for easy updating */ +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + lfs_t * lfs_p = drv->user_data; + uint32_t flags = 0; + + flags = mode == LV_FS_MODE_RD ? LFS_O_RDONLY + : mode == LV_FS_MODE_WR ? LFS_O_WRONLY + : mode == (LV_FS_MODE_WR | LV_FS_MODE_RD) ? LFS_O_RDWR : 0; + + lfs_file_t * file_p = lv_mem_alloc(sizeof(lfs_file_t)); + if(file_p == NULL) return NULL; + + int result = lfs_file_open(lfs_p, file_p, path, flags); + + if(result != LFS_ERR_OK) { + lv_mem_free(file_p); + return NULL; + } + + return file_p; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + lfs_t * lfs_p = drv->user_data; + + int result = lfs_file_close(lfs_p, file_p); + lv_mem_free(file_p); + /*lv_mem_free( lfs_p );*/ /*allocated and freed by outside-code*/ + + if(result != LFS_ERR_OK) return LV_FS_RES_UNKNOWN; + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + lfs_t * lfs_p = drv->user_data; + + lfs_ssize_t result = lfs_file_read(lfs_p, file_p, buf, btr); + if(result < 0) return LV_FS_RES_UNKNOWN; + + *br = (uint32_t) result; + return LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ +#ifndef LFS_READONLY + lfs_t * lfs_p = drv->user_data; + + lfs_ssize_t result = lfs_file_write(lfs_p, file_p, buf, btw); + if(result < 0 || lfs_file_sync(lfs_p, file_p) < 0) return LV_FS_RES_UNKNOWN; + + *bw = (uint32_t) result; + return LV_FS_RES_OK; +#else + return LV_FS_RES_NOT_IMP; +#endif +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + lfs_t * lfs_p = drv->user_data; + + int lfs_whence = whence == LV_FS_SEEK_SET ? LFS_SEEK_SET + : whence == LV_FS_SEEK_CUR ? LFS_SEEK_CUR + : whence == LV_FS_SEEK_END ? LFS_SEEK_END : 0; + + lfs_soff_t result = lfs_file_seek(lfs_p, file_p, pos, lfs_whence); + if(result < 0) return LV_FS_RES_UNKNOWN; + + /*pos = result;*/ /*not supported by lv_fs*/ + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param pos_p pointer to where to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + lfs_t * lfs_p = drv->user_data; + + lfs_soff_t result = lfs_file_tell(lfs_p, file_p); + if(result < 0) return LV_FS_RES_UNKNOWN; + + *pos_p = (uint32_t) result; + return LV_FS_RES_OK; +} + +/** + * Initialize a 'lv_fs_dir_t' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to the directory read descriptor or NULL on error + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + lfs_t * lfs_p = drv->user_data; + + lfs_dir_t * dir_p = lv_mem_alloc(sizeof(lfs_dir_t)); + if(dir_p == NULL) return NULL; + + int result = lfs_dir_open(lfs_p, dir_p, path); + if(result != LFS_ERR_OK) { + lv_mem_free(dir_p); + return NULL; + } + + return dir_p; +} + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param rddir_p pointer to an initialized 'lv_fs_dir_t' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn) +{ + lfs_t * lfs_p = drv->user_data; + struct lfs_info info; + int result; + + info.name[0] = '\0'; + + do { + result = lfs_dir_read(lfs_p, rddir_p, &info); + if(result > 0) { + if(info.type == LFS_TYPE_DIR) { + fn[0] = '/'; + strcpy(&fn[1], info.name); + } + else strcpy(fn, info.name); + } + else if(result == 0) fn[0] = '\0'; /*dir-scan ended*/ + else return LV_FS_RES_UNKNOWN; + + } while(!strcmp(fn, "/.") || !strcmp(fn, "/..")); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param rddir_p pointer to an initialized 'lv_fs_dir_t' variable + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p) +{ + lfs_t * lfs_p = drv->user_data; + + int result = lfs_dir_close(lfs_p, rddir_p); + lv_mem_free(rddir_p); + + if(result != LFS_ERR_OK) return LV_FS_RES_UNKNOWN; + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_LITTLEFS == 0*/ + +#if defined(LV_FS_LITTLEFS_LETTER) && LV_FS_LITTLEFS_LETTER != '\0' + #warning "LV_USE_FS_LITTLEFS is not enabled but LV_FS_LITTLEFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/lib/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c b/lib/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c index f988dae..e656288 100644 --- a/lib/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c +++ b/lib/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c @@ -104,15 +104,15 @@ static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) LV_UNUSED(drv); uint32_t flags = 0; - if(mode == LV_FS_MODE_WR) flags = O_WRONLY; + if(mode == LV_FS_MODE_WR) flags = O_WRONLY | O_CREAT; else if(mode == LV_FS_MODE_RD) flags = O_RDONLY; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR | O_CREAT; /*Make the path relative to the current directory (the projects root folder)*/ char buf[256]; lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); - int f = open(buf, flags); + int f = open(buf, flags, 0666); if(f < 0) return NULL; return (void *)(lv_uintptr_t)f; diff --git a/lib/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h b/lib/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h index 285d598..b864ad6 100644 --- a/lib/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h +++ b/lib/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h @@ -31,6 +31,11 @@ extern "C" { void lv_fs_fatfs_init(void); #endif +#if LV_USE_FS_LITTLEFS != '\0' +void lv_fs_littlefs_init(void); +lv_fs_drv_t * lv_fs_littlefs_set_driver(char label, void * lfs_p); +#endif + #if LV_USE_FS_STDIO != '\0' void lv_fs_stdio_init(void); #endif diff --git a/lib/lvgl/src/extra/libs/gif/gifdec.c b/lib/lvgl/src/extra/libs/gif/gifdec.c index 68f5005..3ee9b71 100644 --- a/lib/lvgl/src/extra/libs/gif/gifdec.c +++ b/lib/lvgl/src/extra/libs/gif/gifdec.c @@ -160,6 +160,7 @@ static gd_GIF * gif_open(gd_GIF * gif_base) #endif } gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->loop_count = -1; goto ok; fail: f_gif_close(gif_base); @@ -239,6 +240,7 @@ read_application_ext(gd_GIF *gif) { char app_id[8]; char app_auth_code[3]; + uint16_t loop_count; /* Discard block size (always 0x0B). */ f_gif_seek(gif, 1, LV_FS_SEEK_CUR); @@ -249,7 +251,15 @@ read_application_ext(gd_GIF *gif) if (!strncmp(app_id, "NETSCAPE", sizeof(app_id))) { /* Discard block size (0x03) and constant byte (0x01). */ f_gif_seek(gif, 2, LV_FS_SEEK_CUR); - gif->loop_count = read_num(gif); + loop_count = read_num(gif); + if(gif->loop_count < 0) { + if(loop_count == 0) { + gif->loop_count = 0; + } + else{ + gif->loop_count = loop_count + 1; + } + } /* Skip block terminator. */ f_gif_seek(gif, 1, LV_FS_SEEK_CUR); } else if (gif->application) { @@ -568,9 +578,16 @@ gd_get_frame(gd_GIF *gif) dispose(gif); f_gif_read(gif, &sep, 1); while (sep != ',') { - if (sep == ';') - return 0; - if (sep == '!') + if (sep == ';') { + f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); + if(gif->loop_count == 1 || gif->loop_count < 0) { + return 0; + } + else if(gif->loop_count > 1) { + gif->loop_count--; + } + } + else if (sep == '!') read_ext(gif); else return -1; f_gif_read(gif, &sep, 1); @@ -598,6 +615,7 @@ gd_render_frame(gd_GIF *gif, uint8_t *buffer) void gd_rewind(gd_GIF *gif) { + gif->loop_count = -1; f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); } diff --git a/lib/lvgl/src/extra/libs/gif/gifdec.h b/lib/lvgl/src/extra/libs/gif/gifdec.h index 00f17c1..b68fab5 100644 --- a/lib/lvgl/src/extra/libs/gif/gifdec.h +++ b/lib/lvgl/src/extra/libs/gif/gifdec.h @@ -29,7 +29,7 @@ typedef struct gd_GIF { int32_t anim_start; uint16_t width, height; uint16_t depth; - uint16_t loop_count; + int32_t loop_count; gd_GCE gce; gd_Palette *palette; gd_Palette lct, gct; diff --git a/lib/lvgl/src/extra/libs/gif/lv_gif.c b/lib/lvgl/src/extra/libs/gif/lv_gif.c index 4cb2955..2bd9e01 100644 --- a/lib/lvgl/src/extra/libs/gif/lv_gif.c +++ b/lib/lvgl/src/extra/libs/gif/lv_gif.c @@ -99,6 +99,8 @@ void lv_gif_restart(lv_obj_t * obj) { lv_gif_t * gifobj = (lv_gif_t *) obj; gd_rewind(gifobj->gif); + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); } /********************** @@ -111,6 +113,7 @@ static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_gif_t * gifobj = (lv_gif_t *) obj; + gifobj->gif = NULL; gifobj->timer = lv_timer_create(next_frame_task_cb, 10, obj); lv_timer_pause(gifobj->timer); } @@ -120,7 +123,8 @@ static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) LV_UNUSED(class_p); lv_gif_t * gifobj = (lv_gif_t *) obj; lv_img_cache_invalidate_src(&gifobj->imgdsc); - gd_close_gif(gifobj->gif); + if(gifobj->gif) + gd_close_gif(gifobj->gif); lv_timer_del(gifobj->timer); } @@ -136,14 +140,9 @@ static void next_frame_task_cb(lv_timer_t * t) int has_next = gd_get_frame(gifobj->gif); if(has_next == 0) { /*It was the last repeat*/ - if(gifobj->gif->loop_count == 1) { - lv_res_t res = lv_event_send(obj, LV_EVENT_READY, NULL); - if(res != LV_FS_RES_OK) return; - } - else { - if(gifobj->gif->loop_count > 1) gifobj->gif->loop_count--; - gd_rewind(gifobj->gif); - } + lv_res_t res = lv_event_send(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + if(res != LV_FS_RES_OK) return; } gd_render_frame(gifobj->gif, (uint8_t *)gifobj->imgdsc.data); diff --git a/lib/lvgl/src/extra/libs/lv_libs.h b/lib/lvgl/src/extra/libs/lv_libs.h index 6782b1d..1fefe6c 100644 --- a/lib/lvgl/src/extra/libs/lv_libs.h +++ b/lib/lvgl/src/extra/libs/lv_libs.h @@ -22,6 +22,7 @@ extern "C" { #include "freetype/lv_freetype.h" #include "rlottie/lv_rlottie.h" #include "ffmpeg/lv_ffmpeg.h" +#include "tiny_ttf/lv_tiny_ttf.h" /********************* * DEFINES diff --git a/lib/lvgl/src/extra/libs/png/lv_png.c b/lib/lvgl/src/extra/libs/png/lv_png.c index d067ef5..9228e29 100644 --- a/lib/lvgl/src/extra/libs/png/lv_png.c +++ b/lib/lvgl/src/extra/libs/png/lv_png.c @@ -103,13 +103,33 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr else if(src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = src; const uint32_t data_size = img_dsc->data_size; + const uint32_t * size = ((uint32_t *)img_dsc->data) + 4; const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; if(data_size < sizeof(magic)) return LV_RES_INV; if(memcmp(magic, img_dsc->data, sizeof(magic))) return LV_RES_INV; header->always_zero = 0; - header->cf = img_dsc->header.cf; /*Save the color format*/ - header->w = img_dsc->header.w; /*Save the color width*/ - header->h = img_dsc->header.h; /*Save the color height*/ + + if(img_dsc->header.cf) { + header->cf = img_dsc->header.cf; /*Save the color format*/ + } + else { + header->cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + } + + if(img_dsc->header.w) { + header->w = img_dsc->header.w; /*Save the image width*/ + } + else { + header->w = (lv_coord_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + } + + if(img_dsc->header.h) { + header->h = img_dsc->header.h; /*Save the color height*/ + } + else { + header->h = (lv_coord_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + } + return LV_RES_OK; } @@ -142,13 +162,13 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * error = lodepng_load_file(&png_data, &png_data_size, fn); /*Load the file*/ if(error) { - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_LOG_WARN("error %" LV_PRIu32 ": %s\n", error, lodepng_error_text(error)); return LV_RES_INV; } /*Decode the PNG image*/ - uint32_t png_width; /*Will be the width of the decoded image*/ - uint32_t png_height; /*Will be the width of the decoded image*/ + unsigned png_width; /*Will be the width of the decoded image*/ + unsigned png_height; /*Will be the width of the decoded image*/ /*Decode the loaded image in ARGB8888 */ error = lodepng_decode32(&img_data, &png_width, &png_height, png_data, png_data_size); @@ -157,7 +177,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * if(img_data != NULL) { lv_mem_free(img_data); } - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_LOG_WARN("error %" LV_PRIu32 ": %s\n", error, lodepng_error_text(error)); return LV_RES_INV; } @@ -170,8 +190,8 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * /*If it's a PNG file in a C array...*/ else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = dsc->src; - uint32_t png_width; /*No used, just required by he decoder*/ - uint32_t png_height; /*No used, just required by he decoder*/ + unsigned png_width; /*No used, just required by he decoder*/ + unsigned png_height; /*No used, just required by he decoder*/ /*Decode the image in ARGB8888 */ error = lodepng_decode32(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size); diff --git a/lib/lvgl/src/extra/libs/qrcode/qrcodegen.c b/lib/lvgl/src/extra/libs/qrcode/qrcodegen.c index 37ee742..bd9f08b 100644 --- a/lib/lvgl/src/extra/libs/qrcode/qrcodegen.c +++ b/lib/lvgl/src/extra/libs/qrcode/qrcodegen.c @@ -21,11 +21,11 @@ * Software. */ -#include #include #include #include #include "qrcodegen.h" +#include "../../../misc/lv_assert.h" #ifndef QRCODEGEN_TEST #define testable static // Keep functions private @@ -127,12 +127,12 @@ static const int PENALTY_N4 = 10; // Public function - see documentation comment in header file. bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[], enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) { - + size_t textLen = strlen(text); if (textLen == 0) return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); - + struct qrcodegen_Segment seg; if (qrcodegen_isNumeric(text)) { if (qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) @@ -155,7 +155,7 @@ bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode seg.data = tempBuffer; } return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); - + fail: qrcode[0] = 0; // Set size to invalid value for safety return false; @@ -165,7 +165,7 @@ fail: // Public function - see documentation comment in header file. bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) { - + struct qrcodegen_Segment seg; seg.mode = qrcodegen_Mode_BYTE; seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); @@ -182,7 +182,7 @@ bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcod // Appends the given number of low-order bits of the given value to the given byte-based // bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits. testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen) { - assert(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); + LV_ASSERT(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); for (int i = numBits - 1; i >= 0; i--, (*bitLen)++) buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7)); } @@ -202,10 +202,10 @@ bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, // Public function - see documentation comment in header file. bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) { - assert(segs != NULL || len == 0); - assert(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); - assert(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); - + LV_ASSERT(segs != NULL || len == 0); + LV_ASSERT(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); + LV_ASSERT(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); + // Find the minimal version number to use int version, dataUsedBits; for (version = minVersion; ; version++) { @@ -218,14 +218,14 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz return false; } } - assert(dataUsedBits != -1); - + LV_ASSERT(dataUsedBits != -1); + // Increase the error correction level while the data still fits in the current version number for (int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high if (boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8) ecl = (enum qrcodegen_Ecc)i; } - + // Concatenate all segments to create the data bit string memset(qrcode, 0, qrcodegen_BUFFER_LEN_FOR_VERSION(version) * sizeof(qrcode[0])); int bitLen = 0; @@ -236,29 +236,29 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz for (int j = 0; j < seg->bitLength; j++) appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen); } - assert(bitLen == dataUsedBits); - + LV_ASSERT(bitLen == dataUsedBits); + // Add terminator and pad up to a byte if applicable int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; - assert(bitLen <= dataCapacityBits); + LV_ASSERT(bitLen <= dataCapacityBits); int terminatorBits = dataCapacityBits - bitLen; if (terminatorBits > 4) terminatorBits = 4; appendBitsToBuffer(0, terminatorBits, qrcode, &bitLen); appendBitsToBuffer(0, (8 - bitLen % 8) % 8, qrcode, &bitLen); - assert(bitLen % 8 == 0); - + LV_ASSERT(bitLen % 8 == 0); + // Pad with alternating bytes until data capacity is reached for (uint8_t padByte = 0xEC; bitLen < dataCapacityBits; padByte ^= 0xEC ^ 0x11) appendBitsToBuffer(padByte, 8, qrcode, &bitLen); - + // Draw function and data codeword modules addEccAndInterleave(qrcode, version, ecl, tempBuffer); initializeFunctionModules(version, qrcode); drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode); drawWhiteFunctionModules(qrcode, version); initializeFunctionModules(version, tempBuffer); - + // Handle masking if (mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask long minPenalty = LONG_MAX; @@ -274,7 +274,7 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR } } - assert(0 <= (int)mask && (int)mask <= 7); + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); applyMask(tempBuffer, qrcode, mask); drawFormatBits(ecl, mask, qrcode); return true; @@ -290,14 +290,14 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz // be clobbered by this function. The final answer is stored in result[0 : rawCodewords]. testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) { // Calculate parameter numbers - assert(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + LV_ASSERT(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version]; int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version]; int rawCodewords = getNumRawDataModules(version) / 8; int dataLen = getNumDataCodewords(version, ecl); int numShortBlocks = numBlocks - rawCodewords % numBlocks; int shortBlockDataLen = rawCodewords / numBlocks - blockEccLen; - + // Split data into blocks, calculate ECC, and interleave // (not concatenate) the bytes into a single sequence uint8_t generator[qrcodegen_REED_SOLOMON_DEGREE_MAX]; @@ -323,7 +323,7 @@ testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ec // for the given version number and error correction level. The result is in the range [9, 2956]. testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) { int v = version, e = (int)ecl; - assert(0 <= e && e < 4); + LV_ASSERT(0 <= e && e < 4); return getNumRawDataModules(v) / 8 - ECC_CODEWORDS_PER_BLOCK [e][v] * NUM_ERROR_CORRECTION_BLOCKS[e][v]; @@ -334,7 +334,7 @@ testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) { // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. testable int getNumRawDataModules(int ver) { - assert(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); + LV_ASSERT(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); int result = (16 * ver + 128) * ver + 64; if (ver >= 2) { int numAlign = ver / 7 + 2; @@ -352,10 +352,10 @@ testable int getNumRawDataModules(int ver) { // Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree]. testable void calcReedSolomonGenerator(int degree, uint8_t result[]) { // Start with the monomial x^0 - assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); memset(result, 0, degree * sizeof(result[0])); result[degree - 1] = 1; - + // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), // drop the highest term, and store the rest of the coefficients in order of descending powers. // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). @@ -376,9 +376,9 @@ testable void calcReedSolomonGenerator(int degree, uint8_t result[]) { // polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree]. testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, const uint8_t generator[], int degree, uint8_t result[]) { - + // Perform polynomial division - assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); memset(result, 0, degree * sizeof(result[0])); for (int i = 0; i < dataLen; i++) { uint8_t factor = data[i] ^ result[0]; @@ -415,16 +415,16 @@ testable void initializeFunctionModules(int version, uint8_t qrcode[]) { int qrsize = version * 4 + 17; memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0])); qrcode[0] = (uint8_t)qrsize; - + // Fill horizontal and vertical timing patterns fillRectangle(6, 0, 1, qrsize, qrcode); fillRectangle(0, 6, qrsize, 1, qrcode); - + // Fill 3 finder patterns (all corners except bottom right) and format bits fillRectangle(0, 0, 9, 9, qrcode); fillRectangle(qrsize - 8, 0, 8, 9, qrcode); fillRectangle(0, qrsize - 8, 9, 8, qrcode); - + // Fill numerous alignment patterns uint8_t alignPatPos[7]; int numAlign = getAlignmentPatternPositions(version, alignPatPos); @@ -435,7 +435,7 @@ testable void initializeFunctionModules(int version, uint8_t qrcode[]) { fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode); } } - + // Fill version blocks if (version >= 7) { fillRectangle(qrsize - 11, 0, 3, 6, qrcode); @@ -454,7 +454,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { setModule(qrcode, 6, i, false); setModule(qrcode, i, 6, false); } - + // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) for (int dy = -4; dy <= 4; dy++) { for (int dx = -4; dx <= 4; dx++) { @@ -468,7 +468,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { } } } - + // Draw numerous alignment patterns uint8_t alignPatPos[7]; int numAlign = getAlignmentPatternPositions(version, alignPatPos); @@ -482,7 +482,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { } } } - + // Draw version blocks if (version >= 7) { // Calculate error correction code and pack bits @@ -490,8 +490,8 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { for (int i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); long bits = (long)version << 12 | rem; // uint18 - assert(bits >> 18 == 0); - + LV_ASSERT(bits >> 18 == 0); + // Draw two copies for (int i = 0; i < 6; i++) { for (int j = 0; j < 3; j++) { @@ -510,15 +510,15 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { // the format bits, unlike drawWhiteFunctionModules() which might skip black modules. static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) { // Calculate error correction code and pack bits - assert(0 <= (int)mask && (int)mask <= 7); + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); static const int table[] = {1, 0, 3, 2}; int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3 int rem = data; for (int i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >> 9) * 0x537); int bits = (data << 10 | rem) ^ 0x5412; // uint15 - assert(bits >> 15 == 0); - + LV_ASSERT(bits >> 15 == 0); + // Draw first copy for (int i = 0; i <= 5; i++) setModule(qrcode, 8, i, getBit(bits, i)); @@ -527,7 +527,7 @@ static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uin setModule(qrcode, 7, 8, getBit(bits, 8)); for (int i = 9; i < 15; i++) setModule(qrcode, 14 - i, 8, getBit(bits, i)); - + // Draw second copy int qrsize = qrcodegen_getSize(qrcode); for (int i = 0; i < 8; i++) @@ -591,7 +591,7 @@ static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) { } } } - assert(i == dataLen * 8); + LV_ASSERT(i == dataLen * 8); } @@ -601,7 +601,7 @@ static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) { // the same mask value a second time will undo the mask. A final well-formed // QR Code needs exactly one (not zero, two, etc.) mask applied. static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) { - assert(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO int qrsize = qrcodegen_getSize(qrcode); for (int y = 0; y < qrsize; y++) { for (int x = 0; x < qrsize; x++) { @@ -617,7 +617,7 @@ static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qr case 5: invert = x * y % 2 + x * y % 3 == 0; break; case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0; break; case 7: invert = ((x + y) % 2 + x * y % 3) % 2 == 0; break; - default: assert(false); return; + default: LV_ASSERT(false); return; } bool val = getModule(qrcode, x, y); setModule(qrcode, x, y, val ^ invert); @@ -631,7 +631,7 @@ static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qr static long getPenaltyScore(const uint8_t qrcode[]) { int qrsize = qrcodegen_getSize(qrcode); long result = 0; - + // Adjacent modules in row having same color, and finder-like patterns for (int y = 0; y < qrsize; y++) { unsigned char runHistory[7] = {0}; @@ -684,7 +684,7 @@ static long getPenaltyScore(const uint8_t qrcode[]) { if (hasFinderLikePattern(runHistory)) result += PENALTY_N3; } - + // 2*2 blocks of modules having same color for (int y = 0; y < qrsize - 1; y++) { for (int x = 0; x < qrsize - 1; x++) { @@ -695,7 +695,7 @@ static long getPenaltyScore(const uint8_t qrcode[]) { result += PENALTY_N2; } } - + // Balance of black and white modules int black = 0; for (int y = 0; y < qrsize; y++) { @@ -737,9 +737,9 @@ static bool hasFinderLikePattern(const unsigned char runHistory[7]) { // Public function - see documentation comment in header file. int qrcodegen_getSize(const uint8_t qrcode[]) { - assert(qrcode != NULL); + LV_ASSERT(qrcode != NULL); int result = qrcode[0]; - assert((qrcodegen_VERSION_MIN * 4 + 17) <= result + LV_ASSERT((qrcodegen_VERSION_MIN * 4 + 17) <= result && result <= (qrcodegen_VERSION_MAX * 4 + 17)); return result; } @@ -747,7 +747,7 @@ int qrcodegen_getSize(const uint8_t qrcode[]) { // Public function - see documentation comment in header file. bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) { - assert(qrcode != NULL); + LV_ASSERT(qrcode != NULL); int qrsize = qrcode[0]; return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y); } @@ -756,7 +756,7 @@ bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) { // Gets the module at the given coordinates, which must be in bounds. testable bool getModule(const uint8_t qrcode[], int x, int y) { int qrsize = qrcode[0]; - assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); int index = y * qrsize + x; return getBit(qrcode[(index >> 3) + 1], index & 7); } @@ -765,7 +765,7 @@ testable bool getModule(const uint8_t qrcode[], int x, int y) { // Sets the module at the given coordinates, which must be in bounds. testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) { int qrsize = qrcode[0]; - assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); int index = y * qrsize + x; int bitIndex = index & 7; int byteIndex = (index >> 3) + 1; @@ -795,7 +795,7 @@ static bool getBit(int x, int i) { // Public function - see documentation comment in header file. bool qrcodegen_isAlphanumeric(const char *text) { - assert(text != NULL); + LV_ASSERT(text != NULL); for (; *text != '\0'; text++) { if (strchr(ALPHANUMERIC_CHARSET, *text) == NULL) return false; @@ -806,7 +806,7 @@ bool qrcodegen_isAlphanumeric(const char *text) { // Public function - see documentation comment in header file. bool qrcodegen_isNumeric(const char *text) { - assert(text != NULL); + LV_ASSERT(text != NULL); for (; *text != '\0'; text++) { if (*text < '0' || *text > '9') return false; @@ -820,7 +820,7 @@ size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars int temp = calcSegmentBitLength(mode, numChars); if (temp == -1) return SIZE_MAX; - assert(0 <= temp && temp <= INT16_MAX); + LV_ASSERT(0 <= temp && temp <= INT16_MAX); return ((size_t)temp + 7) / 8; } @@ -849,10 +849,10 @@ testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) { else if (mode == qrcodegen_Mode_ECI && numChars == 0) result = 3 * 8; else { // Invalid argument - assert(false); + LV_ASSERT(false); return -1; } - assert(result >= 0); + LV_ASSERT(result >= 0); if ((unsigned int)result > (unsigned int)INT16_MAX) return -1; return (int)result; @@ -861,11 +861,11 @@ testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) { // Public function - see documentation comment in header file. struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) { - assert(data != NULL || len == 0); + LV_ASSERT(data != NULL || len == 0); struct qrcodegen_Segment result; result.mode = qrcodegen_Mode_BYTE; result.bitLength = calcSegmentBitLength(result.mode, len); - assert(result.bitLength != -1); + LV_ASSERT(result.bitLength != -1); result.numChars = (int)len; if (len > 0) memcpy(buf, data, len * sizeof(buf[0])); @@ -876,22 +876,22 @@ struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, u // Public function - see documentation comment in header file. struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]) { - assert(digits != NULL); + LV_ASSERT(digits != NULL); struct qrcodegen_Segment result; size_t len = strlen(digits); result.mode = qrcodegen_Mode_NUMERIC; int bitLen = calcSegmentBitLength(result.mode, len); - assert(bitLen != -1); + LV_ASSERT(bitLen != -1); result.numChars = (int)len; if (bitLen > 0) memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); result.bitLength = 0; - + unsigned int accumData = 0; int accumCount = 0; for (; *digits != '\0'; digits++) { char c = *digits; - assert('0' <= c && c <= '9'); + LV_ASSERT('0' <= c && c <= '9'); accumData = accumData * 10 + (unsigned int)(c - '0'); accumCount++; if (accumCount == 3) { @@ -902,7 +902,7 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[] } if (accumCount > 0) // 1 or 2 digits remaining appendBitsToBuffer(accumData, accumCount * 3 + 1, buf, &result.bitLength); - assert(result.bitLength == bitLen); + LV_ASSERT(result.bitLength == bitLen); result.data = buf; return result; } @@ -910,22 +910,22 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[] // Public function - see documentation comment in header file. struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]) { - assert(text != NULL); + LV_ASSERT(text != NULL); struct qrcodegen_Segment result; size_t len = strlen(text); result.mode = qrcodegen_Mode_ALPHANUMERIC; int bitLen = calcSegmentBitLength(result.mode, len); - assert(bitLen != -1); + LV_ASSERT(bitLen != -1); result.numChars = (int)len; if (bitLen > 0) memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); result.bitLength = 0; - + unsigned int accumData = 0; int accumCount = 0; for (; *text != '\0'; text++) { const char *temp = strchr(ALPHANUMERIC_CHARSET, *text); - assert(temp != NULL); + LV_ASSERT(temp != NULL); accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET); accumCount++; if (accumCount == 2) { @@ -936,7 +936,7 @@ struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t bu } if (accumCount > 0) // 1 character remaining appendBitsToBuffer(accumData, 6, buf, &result.bitLength); - assert(result.bitLength == bitLen); + LV_ASSERT(result.bitLength == bitLen); result.data = buf; return result; } @@ -949,7 +949,7 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { result.numChars = 0; result.bitLength = 0; if (assignVal < 0) { - assert(false); + LV_ASSERT(false); } else if (assignVal < (1 << 7)) { memset(buf, 0, 1 * sizeof(buf[0])); appendBitsToBuffer(assignVal, 8, buf, &result.bitLength); @@ -963,7 +963,7 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { appendBitsToBuffer(assignVal >> 10, 11, buf, &result.bitLength); appendBitsToBuffer(assignVal & 0x3FF, 10, buf, &result.bitLength); } else { - assert(false); + LV_ASSERT(false); } result.data = buf; return result; @@ -974,22 +974,22 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { // Returns a non-negative number if successful. Otherwise returns -1 if a segment has too // many characters to fit its length field, or the total bits exceeds INT16_MAX. testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) { - assert(segs != NULL || len == 0); + LV_ASSERT(segs != NULL || len == 0); long result = 0; for (size_t i = 0; i < len; i++) { int numChars = segs[i].numChars; int bitLength = segs[i].bitLength; - assert(0 <= numChars && numChars <= INT16_MAX); - assert(0 <= bitLength && bitLength <= INT16_MAX); + LV_ASSERT(0 <= numChars && numChars <= INT16_MAX); + LV_ASSERT(0 <= bitLength && bitLength <= INT16_MAX); int ccbits = numCharCountBits(segs[i].mode, version); - assert(0 <= ccbits && ccbits <= 16); + LV_ASSERT(0 <= ccbits && ccbits <= 16); if (numChars >= (1L << ccbits)) return -1; // The segment's length doesn't fit the field's bit width result += 4L + ccbits + bitLength; if (result > INT16_MAX) return -1; // The sum might overflow an int type } - assert(0 <= result && result <= INT16_MAX); + LV_ASSERT(0 <= result && result <= INT16_MAX); return (int)result; } @@ -997,7 +997,7 @@ testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int // Returns the bit width of the character count field for a segment in the given mode // in a QR Code at the given version number. The result is in the range [0, 16]. static int numCharCountBits(enum qrcodegen_Mode mode, int version) { - assert(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + LV_ASSERT(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); int i = (version + 7) / 17; switch (mode) { case qrcodegen_Mode_NUMERIC : { static const int temp[] = {10, 12, 14}; return temp[i]; } @@ -1005,7 +1005,7 @@ static int numCharCountBits(enum qrcodegen_Mode mode, int version) { case qrcodegen_Mode_BYTE : { static const int temp[] = { 8, 16, 16}; return temp[i]; } case qrcodegen_Mode_KANJI : { static const int temp[] = { 8, 10, 12}; return temp[i]; } case qrcodegen_Mode_ECI : return 0; - default: assert(false); return -1; // Dummy value + default: LV_ASSERT(false); return -1; // Dummy value } } diff --git a/lib/lvgl/src/extra/libs/tiny_ttf/lv_tiny_ttf.c b/lib/lvgl/src/extra/libs/tiny_ttf/lv_tiny_ttf.c new file mode 100644 index 0000000..c275bfe --- /dev/null +++ b/lib/lvgl/src/extra/libs/tiny_ttf/lv_tiny_ttf.c @@ -0,0 +1,284 @@ +#include "lv_tiny_ttf.h" + +#if LV_USE_TINY_TTF +#include +#include "../../../misc/lv_lru.h" + +#define STB_RECT_PACK_IMPLEMENTATION +#define STBRP_STATIC +#define STBTT_STATIC +#define STB_TRUETYPE_IMPLEMENTATION +#define STBTT_HEAP_FACTOR_SIZE_32 50 +#define STBTT_HEAP_FACTOR_SIZE_128 20 +#define STBTT_HEAP_FACTOR_SIZE_DEFAULT 10 +#define STBTT_malloc(x, u) ((void)(u), lv_mem_alloc(x)) +#define STBTT_free(x, u) ((void)(u), lv_mem_free(x)) +#define TTF_MALLOC(x) (lv_mem_alloc(x)) +#define TTF_FREE(x) (lv_mem_free(x)) + +#if LV_TINY_TTF_FILE_SUPPORT +/* a hydra stream that can be in memory or from a file*/ +typedef struct ttf_cb_stream { + lv_fs_file_t * file; + const void * data; + size_t size; + size_t position; +} ttf_cb_stream_t; + +static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read) +{ + if(stream->file != NULL) { + uint32_t br; + lv_fs_read(stream->file, data, to_read, &br); + } + else { + if(to_read + stream->position >= stream->size) { + to_read = stream->size - stream->position; + } + lv_memcpy(data, ((const unsigned char *)stream->data + stream->position), to_read); + stream->position += to_read; + } +} +static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position) +{ + if(stream->file != NULL) { + lv_fs_seek(stream->file, position, LV_FS_SEEK_SET); + } + else { + if(position > stream->size) { + stream->position = stream->size; + } + else { + stream->position = position; + } + } +} + +/* for stream support */ +#define STBTT_STREAM_TYPE ttf_cb_stream_t * +#define STBTT_STREAM_SEEK(s, x) ttf_cb_stream_seek(s, x); +#define STBTT_STREAM_READ(s, x, y) ttf_cb_stream_read(s, x, y); +#endif /*LV_TINY_TTF_FILE_SUPPORT*/ + +#include "stb_rect_pack.h" +#include "stb_truetype_htcw.h" + +typedef struct ttf_font_desc { + lv_fs_file_t file; +#if LV_TINY_TTF_FILE_SUPPORT + ttf_cb_stream_t stream; +#else + const uint8_t * stream; +#endif + stbtt_fontinfo info; + float scale; + int ascent; + int descent; + lv_lru_t * bitmap_cache; +} ttf_font_desc_t; + +typedef struct ttf_bitmap_cache_key { + uint32_t unicode_letter; + lv_coord_t line_height; +} ttf_bitmap_cache_key_t; + +static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + if(unicode_letter < 0x20 || + unicode_letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/ + unicode_letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/ + dsc_out->box_w = 0; + dsc_out->adv_w = 0; + dsc_out->box_h = 0; /*height of the bitmap in [px]*/ + dsc_out->ofs_x = 0; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = 0; /*Y offset of the bitmap in [pf]*/ + dsc_out->bpp = 0; + dsc_out->is_placeholder = false; + return true; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + int g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return false; + } + int x1, y1, x2, y2; + + stbtt_GetGlyphBitmapBox(&dsc->info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int g2 = 0; + if(unicode_letter_next != 0) { + g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); + } + int advw, lsb; + stbtt_GetGlyphHMetrics(&dsc->info, g1, &advw, &lsb); + int k = stbtt_GetGlyphKernAdvance(&dsc->info, g1, g2); + dsc_out->adv_w = (uint16_t)floor((((float)advw + (float)k) * dsc->scale) + + 0.5f); /*Horizontal space required by the glyph in [px]*/ + + dsc_out->adv_w = (uint16_t)floor((((float)advw + (float)k) * dsc->scale) + + 0.5f); /*Horizontal space required by the glyph in [px]*/ + dsc_out->box_w = (x2 - x1 + 1); /*width of the bitmap in [px]*/ + dsc_out->box_h = (y2 - y1 + 1); /*height of the bitmap in [px]*/ + dsc_out->ofs_x = x1; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = -y2; /*Y offset of the bitmap measured from the as line*/ + dsc_out->bpp = 8; /*Bits per pixel: 1/2/4/8*/ + dsc_out->is_placeholder = false; + return true; /*true: glyph found; false: glyph was not found*/ +} + +static const uint8_t * ttf_get_glyph_bitmap_cb(const lv_font_t * font, uint32_t unicode_letter) +{ + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + const stbtt_fontinfo * info = (const stbtt_fontinfo *)&dsc->info; + int g1 = stbtt_FindGlyphIndex(info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return NULL; + } + int x1, y1, x2, y2; + stbtt_GetGlyphBitmapBox(info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int w, h; + w = x2 - x1 + 1; + h = y2 - y1 + 1; + uint32_t stride = w; + /*Try to load from cache*/ + ttf_bitmap_cache_key_t cache_key; + lv_memset(&cache_key, 0, sizeof(cache_key)); /*Zero padding*/ + cache_key.unicode_letter = unicode_letter; + cache_key.line_height = font->line_height; + uint8_t * buffer = NULL; + lv_lru_get(dsc->bitmap_cache, &cache_key, sizeof(cache_key), (void **)&buffer); + if(buffer) { + return buffer; + } + LV_LOG_TRACE("cache miss for letter: %u", unicode_letter); + /*Prepare space in cache*/ + size_t szb = h * stride; + buffer = lv_mem_alloc(szb); + if(!buffer) { + LV_LOG_ERROR("failed to allocate cache value"); + return NULL; + } + lv_memset(buffer, 0, szb); + if(LV_LRU_OK != lv_lru_set(dsc->bitmap_cache, &cache_key, sizeof(cache_key), buffer, szb)) { + LV_LOG_ERROR("failed to add cache value"); + lv_mem_free(buffer); + return NULL; + } + /*Render into cache*/ + stbtt_MakeGlyphBitmap(info, buffer, w, h, stride, dsc->scale, dsc->scale, g1); + return buffer; +} + +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, lv_coord_t font_size, + size_t cache_size) +{ + if((path == NULL && data == NULL) || 0 >= font_size) { + LV_LOG_ERROR("tiny_ttf: invalid argument\n"); + return NULL; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)TTF_MALLOC(sizeof(ttf_font_desc_t)); + if(dsc == NULL) { + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + return NULL; + } +#if LV_TINY_TTF_FILE_SUPPORT + if(path != NULL) { + if(LV_FS_RES_OK != lv_fs_open(&dsc->file, path, LV_FS_MODE_RD)) { + LV_LOG_ERROR("tiny_ttf: unable to open %s\n", path); + goto err_after_dsc; + } + dsc->stream.file = &dsc->file; + } + else { + dsc->stream.file = NULL; + dsc->stream.data = (const uint8_t *)data; + dsc->stream.size = data_size; + dsc->stream.position = 0; + } + if(0 == stbtt_InitFont(&dsc->info, &dsc->stream, stbtt_GetFontOffsetForIndex(&dsc->stream, 0))) { + LV_LOG_ERROR("tiny_ttf: init failed\n"); + goto err_after_dsc; + } + +#else + dsc->stream = (const uint8_t *)data; + LV_UNUSED(data_size); + if(0 == stbtt_InitFont(&dsc->info, dsc->stream, stbtt_GetFontOffsetForIndex(dsc->stream, 0))) { + LV_LOG_ERROR("tiny_ttf: init failed\n"); + goto err_after_dsc; + } +#endif + + dsc->bitmap_cache = lv_lru_create(cache_size, font_size * font_size, lv_mem_free, lv_mem_free); + if(dsc->bitmap_cache == NULL) { + LV_LOG_ERROR("failed to create lru cache"); + goto err_after_dsc; + } + + lv_font_t * out_font = (lv_font_t *)TTF_MALLOC(sizeof(lv_font_t)); + if(out_font == NULL) { + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + goto err_after_bitmap_cache; + } + lv_memset(out_font, 0, sizeof(lv_font_t)); + out_font->get_glyph_dsc = ttf_get_glyph_dsc_cb; + out_font->get_glyph_bitmap = ttf_get_glyph_bitmap_cb; + out_font->dsc = dsc; + lv_tiny_ttf_set_size(out_font, font_size); + return out_font; +err_after_bitmap_cache: + lv_lru_del(dsc->bitmap_cache); +err_after_dsc: + TTF_FREE(dsc); + return NULL; +} +#if LV_TINY_TTF_FILE_SUPPORT +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t font_size, size_t cache_size) +{ + return lv_tiny_ttf_create(path, NULL, 0, font_size, cache_size); +} +lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t font_size) +{ + return lv_tiny_ttf_create_file_ex(path, font_size, 4096); +} +#endif /*LV_TINY_TTF_FILE_SUPPORT*/ +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size) +{ + return lv_tiny_ttf_create(NULL, data, data_size, font_size, cache_size); +} +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t font_size) +{ + return lv_tiny_ttf_create_data_ex(data, data_size, font_size, 4096); +} +void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t font_size) +{ + if(font_size <= 0) { + LV_LOG_ERROR("invalid font size: %"PRIx32, font_size); + return; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + dsc->scale = stbtt_ScaleForMappingEmToPixels(&dsc->info, font_size); + int line_gap = 0; + stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); + font->line_height = (lv_coord_t)(dsc->scale * (dsc->ascent - dsc->descent + line_gap)); + font->base_line = (lv_coord_t)(dsc->scale * (line_gap - dsc->descent)); +} +void lv_tiny_ttf_destroy(lv_font_t * font) +{ + if(font != NULL) { + if(font->dsc != NULL) { + ttf_font_desc_t * ttf = (ttf_font_desc_t *)font->dsc; +#if LV_TINY_TTF_FILE_SUPPORT + if(ttf->stream.file != NULL) { + lv_fs_close(&ttf->file); + } +#endif + lv_lru_del(ttf->bitmap_cache); + TTF_FREE(ttf); + } + TTF_FREE(font); + } +} +#endif /*LV_USE_TINY_TTF*/ diff --git a/lib/lvgl/src/extra/libs/tiny_ttf/lv_tiny_ttf.h b/lib/lvgl/src/extra/libs/tiny_ttf/lv_tiny_ttf.h new file mode 100644 index 0000000..fe0936b --- /dev/null +++ b/lib/lvgl/src/extra/libs/tiny_ttf/lv_tiny_ttf.h @@ -0,0 +1,62 @@ +/** + * @file lv_tiny_ttf.h + * + */ + +#ifndef LV_TINY_TTF_H +#define LV_TINY_TTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_TINY_TTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_TINY_TTF_FILE_SUPPORT +/* create a font from the specified file or path with the specified line height.*/ +lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t font_size); + +/* create a font from the specified file or path with the specified line height with the specified cache size.*/ +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t font_size, size_t cache_size); +#endif /*LV_TINY_TTF_FILE_SUPPORT*/ + +/* create a font from the specified data pointer with the specified line height.*/ +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t font_size); + +/* create a font from the specified data pointer with the specified line height and the specified cache size.*/ +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size); + +/* set the size of the font to a new font_size*/ +void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t font_size); + +/* destroy a font previously created with lv_tiny_ttf_create_xxxx()*/ +void lv_tiny_ttf_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TINY_TTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TINY_TTF_H*/ diff --git a/lib/lvgl/src/extra/libs/tiny_ttf/stb_rect_pack.h b/lib/lvgl/src/extra/libs/tiny_ttf/stb_rect_pack.h new file mode 100644 index 0000000..413e504 --- /dev/null +++ b/lib/lvgl/src/extra/libs/tiny_ttf/stb_rect_pack.h @@ -0,0 +1,637 @@ +// stb_rect_pack.h - v1.01 - public domain - rectangle packing +// Sean Barrett 2014 +// +// Useful for e.g. packing rectangular textures into an atlas. +// Does not do rotation. +// +// Before #including, +// +// #define STB_RECT_PACK_IMPLEMENTATION +// +// in the file that you want to have the implementation. +// +// Not necessarily the awesomest packing method, but better than +// the totally naive one in stb_truetype (which is primarily what +// this is meant to replace). +// +// Has only had a few tests run, may have issues. +// +// More docs to come. +// +// No memory allocations; uses qsort() and assert() from stdlib. +// Can override those by defining STBRP_SORT and STBRP_ASSERT. +// +// This library currently uses the Skyline Bottom-Left algorithm. +// +// Please note: better rectangle packers are welcome! Please +// implement them to the same API, but with a different init +// function. +// +// Credits +// +// Library +// Sean Barrett +// Minor features +// Martins Mozeiko +// github:IntellectualKitty +// +// Bugfixes / warning fixes +// Jeremy Jaussaud +// Fabian Giesen +// +// Version history: +// +// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles +// 0.99 (2019-02-07) warning fixes +// 0.11 (2017-03-03) return packing success/fail result +// 0.10 (2016-10-25) remove cast-away-const to avoid warnings +// 0.09 (2016-08-27) fix compiler warnings +// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) +// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) +// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort +// 0.05: added STBRP_ASSERT to allow replacing assert +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release +// +// LICENSE +// +// See end of file for license information. + +////////////////////////////////////////////////////////////////////////////// +// +// INCLUDE SECTION +// + +#ifndef STB_INCLUDE_STB_RECT_PACK_H +#define STB_INCLUDE_STB_RECT_PACK_H + +#define STB_RECT_PACK_VERSION 1 + +#ifdef STBRP_STATIC + #define STBRP_DEF static +#else + #define STBRP_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_context stbrp_context; +typedef struct stbrp_node stbrp_node; +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +typedef int stbrp_coord; + +#define STBRP__MAXVAL 0x7fffffff +// Mostly for internal use, but this is the maximum supported coordinate value. + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects); +// Assign packed locations to rectangles. The rectangles are of type +// 'stbrp_rect' defined below, stored in the array 'rects', and there +// are 'num_rects' many of them. +// +// Rectangles which are successfully packed have the 'was_packed' flag +// set to a non-zero value and 'x' and 'y' store the minimum location +// on each axis (i.e. bottom-left in cartesian coordinates, top-left +// if you imagine y increasing downwards). Rectangles which do not fit +// have the 'was_packed' flag set to 0. +// +// You should not try to access the 'rects' array from another thread +// while this function is running, as the function temporarily reorders +// the array while it executes. +// +// To pack into another rectangle, you need to call stbrp_init_target +// again. To continue packing into the same rectangle, you can call +// this function again. Calling this multiple times with multiple rect +// arrays will probably produce worse packing results than calling it +// a single time with the full rectangle array, but the option is +// available. +// +// The function returns 1 if all of the rectangles were successfully +// packed and 0 otherwise. + +struct stbrp_rect { + // reserved for your use: + int id; + + // input: + stbrp_coord w, h; + + // output: + stbrp_coord x, y; + int was_packed; // non-zero if valid packing + +}; // 16 bytes, nominally + + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes); +// Initialize a rectangle packer to: +// pack a rectangle that is 'width' by 'height' in dimensions +// using temporary storage provided by the array 'nodes', which is 'num_nodes' long +// +// You must call this function every time you start packing into a new target. +// +// There is no "shutdown" function. The 'nodes' memory must stay valid for +// the following stbrp_pack_rects() call (or calls), but can be freed after +// the call (or calls) finish. +// +// Note: to guarantee best results, either: +// 1. make sure 'num_nodes' >= 'width' +// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' +// +// If you don't do either of the above things, widths will be quantized to multiples +// of small integers to guarantee the algorithm doesn't run out of temporary storage. +// +// If you do #2, then the non-quantized algorithm will be used, but the algorithm +// may run out of temporary storage and be unable to pack some rectangles. + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem); +// Optionally call this function after init but before doing any packing to +// change the handling of the out-of-temp-memory scenario, described above. +// If you call init again, this will be reset to the default (false). + + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic); +// Optionally select which packing heuristic the library should use. Different +// heuristics will produce better/worse results for different data sets. +// If you call init again, this will be reset to the default. + +enum { + STBRP_HEURISTIC_Skyline_default = 0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight +}; + + +////////////////////////////////////////////////////////////////////////////// +// +// the details of the following structures don't matter to you, but they must +// be visible so you can handle the memory allocations for them + +struct stbrp_node { + stbrp_coord x, y; + stbrp_node * next; +}; + +struct stbrp_context { + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + stbrp_node * active_head; + stbrp_node * free_head; + stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' +}; + +#ifdef __cplusplus +} +#endif + +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION SECTION +// + +#ifdef STB_RECT_PACK_IMPLEMENTATION +#ifndef STBRP_SORT + #include + #define STBRP_SORT qsort +#endif + +#ifndef STBRP_ASSERT + #include + #define STBRP_ASSERT assert +#endif + +#ifdef _MSC_VER + #define STBRP__NOTUSED(v) (void)(v) + #define STBRP__CDECL __cdecl +#else + #define STBRP__NOTUSED(v) (void)sizeof(v) + #define STBRP__CDECL +#endif + +enum { + STBRP__INIT_skyline = 1 +}; + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic) +{ + switch(context->init_mode) { + case STBRP__INIT_skyline: + STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); + context->heuristic = heuristic; + break; + default: + STBRP_ASSERT(0); + } +} + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem) +{ + if(allow_out_of_mem) + // if it's ok to run out of memory, then don't bother aligning them; + // this gives better packing, but may fail due to OOM (even though + // the rectangles easily fit). @TODO a smarter approach would be to only + // quantize once we've hit OOM, then we could get rid of this parameter. + context->align = 1; + else { + // if it's not ok to run out of memory, then quantize the widths + // so that num_nodes is always enough nodes. + // + // I.e. num_nodes * align >= width + // align >= width / num_nodes + // align = ceil(width/num_nodes) + + context->align = (context->width + context->num_nodes - 1) / context->num_nodes; + } +} + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes) +{ + int i; + + for(i = 0; i < num_nodes - 1; ++i) + nodes[i].next = &nodes[i + 1]; + nodes[i].next = NULL; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + + // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (stbrp_coord) width; + context->extra[1].y = (1 << 30); + context->extra[1].next = NULL; +} + +// find minimum y position if it starts at x1 +static int stbrp__skyline_find_min_y(stbrp_context * c, stbrp_node * first, int x0, int width, int * pwaste) +{ + stbrp_node * node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + + STBRP__NOTUSED(c); + + STBRP_ASSERT(first->x <= x0); + +#if 0 + // skip in case we're past the node + while(node->next->x <= x0) + ++node; +#else + STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency +#endif + + STBRP_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while(node->x < x1) { + if(node->y > min_y) { + // raise min_y higher. + // we've accounted for all waste up to min_y, + // but we'll now add more waste for everything we've visited + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + // the first time through, visited_width might be reduced + if(node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } + else { + // add waste area + int under_width = node->next->x - node->x; + if(under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + + *pwaste = waste_area; + return min_y; +} + +typedef struct { + int x, y; + stbrp_node ** prev_link; +} stbrp__findresult; + +static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context * c, int width, int height) +{ + int best_waste = (1 << 30), best_x, best_y = (1 << 30); + stbrp__findresult fr; + stbrp_node ** prev, * node, * tail, ** best = NULL; + + // align to multiple of c->align + width = (width + c->align - 1); + width -= width % c->align; + STBRP_ASSERT(width % c->align == 0); + + // if it can't possibly fit, bail immediately + if(width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while(node->x + width <= c->width) { + int y, waste; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if(c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL + // bottom left + if(y < best_y) { + best_y = y; + best = prev; + } + } + else { + // best-fit + if(y + height <= c->height) { + // can only use it if it first vertically + if(y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + + best_x = (best == NULL) ? 0 : (*best)->x; + + // if doing best-fit (BF), we also have to try aligning right edge to each node position + // + // e.g, if fitting + // + // ____________________ + // |____________________| + // + // into + // + // | | + // | ____________| + // |____________| + // + // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned + // + // This makes BF take about 2x the time + + if(c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + // find first node that's admissible + while(tail->x < width) + tail = tail->next; + while(tail) { + int xpos = tail->x - width; + int y, waste; + STBRP_ASSERT(xpos >= 0); + // find the left position that matches this + while(node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if(y + height <= c->height) { + if(y <= best_y) { + if(y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x)) { + best_x = xpos; + STBRP_ASSERT(y <= best_y); + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} + +static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context * context, int width, int height) +{ + // find best position according to heuristic + stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node * node, * cur; + + // bail if: + // 1. it failed + // 2. the best node doesn't fit (we don't always check this) + // 3. we're out of memory + if(res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { + res.prev_link = NULL; + return res; + } + + // on success, create new node + node = context->free_head; + node->x = (stbrp_coord) res.x; + node->y = (stbrp_coord)(res.y + height); + + context->free_head = node->next; + + // insert the new node into the right starting point, and + // let 'cur' point to the remaining nodes needing to be + // stiched back in + + cur = *res.prev_link; + if(cur->x < res.x) { + // preserve the existing one, so start testing with the next one + stbrp_node * next = cur->next; + cur->next = node; + cur = next; + } + else { + *res.prev_link = node; + } + + // from here, traverse cur and free the nodes, until we get to one + // that shouldn't be freed + while(cur->next && cur->next->x <= res.x + width) { + stbrp_node * next = cur->next; + // move the current node to the free list + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + // stitch the list back in + node->next = cur; + + if(cur->x < res.x + width) + cur->x = (stbrp_coord)(res.x + width); + +#ifdef _DEBUG + cur = context->active_head; + while(cur->x < context->width) { + STBRP_ASSERT(cur->x < cur->next->x); + cur = cur->next; + } + STBRP_ASSERT(cur->next == NULL); + + { + int count = 0; + cur = context->active_head; + while(cur) { + cur = cur->next; + ++count; + } + cur = context->free_head; + while(cur) { + cur = cur->next; + ++count; + } + STBRP_ASSERT(count == context->num_nodes + 2); + } +#endif + + return res; +} + +static int STBRP__CDECL rect_height_compare(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + if(p->h > q->h) + return -1; + if(p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} + +static int STBRP__CDECL rect_original_order(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects) +{ + int i, all_rects_packed = 1; + + // we use the 'was_packed' field internally to allow sorting/unsorting + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + // sort according to heuristic + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); + + for(i = 0; i < num_rects; ++i) { + if(rects[i].w == 0 || rects[i].h == 0) { + rects[i].x = rects[i].y = 0; // empty rect needs no space + } + else { + stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if(fr.prev_link) { + rects[i].x = (stbrp_coord) fr.x; + rects[i].y = (stbrp_coord) fr.y; + } + else { + rects[i].x = rects[i].y = STBRP__MAXVAL; + } + } + } + + // unsort + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); + + // set was_packed flags and all_rects_packed status + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); + if(!rects[i].was_packed) + all_rects_packed = 0; + } + + // return the all_rects_packed status + return all_rects_packed; +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/lib/lvgl/src/extra/libs/tiny_ttf/stb_truetype_htcw.h b/lib/lvgl/src/extra/libs/tiny_ttf/stb_truetype_htcw.h new file mode 100644 index 0000000..d0e839d --- /dev/null +++ b/lib/lvgl/src/extra/libs/tiny_ttf/stb_truetype_htcw.h @@ -0,0 +1,5572 @@ +// stb_truetype.h - v1.26htcw (fork to enable streaming and low memory environments) +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512, 512, *text - 32, &x, &y, &q, 1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0, q.t0); + glVertex2f(q.x0, q.y0); + glTexCoord2f(q.s1, q.t0); + glVertex2f(q.x1, q.y0); + glTexCoord2f(q.s1, q.t1); + glVertex2f(q.x1, q.y1); + glTexCoord2f(q.s0, q.t1); + glVertex2f(q.x0, q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1 << 25]; + +int main(int argc, char ** argv) +{ + stbtt_fontinfo font; + unsigned char * bitmap; + int w, h, i, j, c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1 << 25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0, stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0, 0); + + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j * w + i] >> 5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24 << 20]; +unsigned char screen[20][79]; + +int main(int arg, char ** argv) +{ + stbtt_fontinfo font; + int i, j, ascent, baseline, ch = 0; + float scale, xpos = 2; // leave a little padding in case the character extends left + char * text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent, 0, 0); + baseline = (int)(ascent * scale); + + while(text[ch]) { + int advance, lsb, x0, y0, x1, y1; + float x_shift = xpos - (float)floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale, scale, x_shift, 0, &x0, &y0, &x1, &y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int)xpos + x0], x1 - x0, y1 - y0, 79, scale, scale, + x_shift, 0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if(text[ch + 1]) + xpos += scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]); + ++ch; + } + + for(j = 0; j < 20; ++j) { + for(i = 0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i] >> 5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION +// #define your own (u)stbtt_int8/16/32 before including to override this +#ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; +#endif + +typedef char stbtt__check_size32[sizeof(stbtt_int32) == 4 ? 1 : -1]; +typedef char stbtt__check_size16[sizeof(stbtt_int16) == 2 ? 1 : -1]; + +// define STBTT_STDIO_STREAM to stream from a FILE object +// instead of from memory. Or define STBTT_STREAM_TYPE, +// STBTT_STREAM_READ and STBTT_STREAM_SEEK to implement +// another streaming source +#ifdef STBTT_STDIO_STREAM + #include + #define STBTT_STREAM_TYPE FILE* + #define STBTT_STREAM_READ(s,x,y) fread(x,1,y,s); + #define STBTT_STREAM_SEEK(s,x) fseek(s,x,SEEK_SET); +#endif + +// heap factor sizes for various counts of objects +// adjust for your platform. Below is suitable for +// modern PC class machines. +#ifndef STBTT_HEAP_FACTOR_SIZE_32 + #define STBTT_HEAP_FACTOR_SIZE_32 2000 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_128 + #define STBTT_HEAP_FACTOR_SIZE_128 800 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_DEFAULT + #define STBTT_HEAP_FACTOR_SIZE_DEFAULT 100 +#endif + +// e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h +#ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) +#endif + +#ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) (float)sqrt(x) + #define STBTT_pow(x,y) pow(x,y) +#endif + +#ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) +#endif + +#ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) +#endif + +#ifndef STBTT_fabs + #include + #define STBTT_fabs(x) (float)fabs(x) +#endif + +// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h +#ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) +#endif + +#ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) +#endif + +#ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) +#endif + +#ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC + #define STBTT_DEF static +#else + #define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct { +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; + stbtt_uint32 offset; +#else + unsigned char * data; +#endif + int cursor; + int size; +} stbtt__buf; + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; +} stbtt_bakedchar; + +typedef struct { + float x0, y0, s0, t0; // top-left + float x1, y1, s1, t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; + float xoff2, yoff2; +} stbtt_packedchar; + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +/// @endcond + +#ifndef STB_RECT_PACK_VERSION +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +#endif +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int width, int height, + int stride_in_bytes, int padding, void * alloc_context); + +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +typedef struct { + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int * array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar * chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, + unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph received the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void * user_allocator_context; + void * pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char * pixels; + void * nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data); +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data); +#endif +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE, int index); +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index); +#endif + +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo { + void * userdata; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; +#else + unsigned char * data; // pointer to .ttf file +#endif + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca, head, glyf, hhea, hmtx, kern, gpos, svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset); +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset); +#endif +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct _stbtt_kerningentry { + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) +enum { + STBTT_vmove = 1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic +}; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values +// (we share this with other code at RAD) +#define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file +typedef struct { + stbtt_vertex_type x, y, cx, cy, cx1, cy1; + unsigned char type, padding; +} stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex ** vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex ** vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * vertices); +// frees the data allocated above + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); + + +// @TODO: don't expose this structure +typedef struct { + int w, h, stride; + unsigned char * pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex * vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void * userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + + + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags); +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags); +#endif +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2); +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2); +#endif +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID); + +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE = 0, + STBTT_PLATFORM_ID_MAC = 1, + STBTT_PLATFORM_ID_ISO = 2, + STBTT_PLATFORM_ID_MICROSOFT = 3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 = 0, + STBTT_UNICODE_EID_UNICODE_1_1 = 1, + STBTT_UNICODE_EID_ISO_10646 = 2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL = 0, + STBTT_MS_EID_UNICODE_BMP = 1, + STBTT_MS_EID_SHIFTJIS = 2, + STBTT_MS_EID_UNICODE_FULL = 10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN = 0, STBTT_MAC_EID_ARABIC = 4, + STBTT_MAC_EID_JAPANESE = 1, STBTT_MAC_EID_HEBREW = 5, + STBTT_MAC_EID_CHINESE_TRAD = 2, STBTT_MAC_EID_GREEK = 6, + STBTT_MAC_EID_KOREAN = 3, STBTT_MAC_EID_RUSSIAN = 7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH = 0x0409, STBTT_MS_LANG_ITALIAN = 0x0410, + STBTT_MS_LANG_CHINESE = 0x0804, STBTT_MS_LANG_JAPANESE = 0x0411, + STBTT_MS_LANG_DUTCH = 0x0413, STBTT_MS_LANG_KOREAN = 0x0412, + STBTT_MS_LANG_FRENCH = 0x040c, STBTT_MS_LANG_RUSSIAN = 0x0419, + STBTT_MS_LANG_GERMAN = 0x0407, STBTT_MS_LANG_SPANISH = 0x0409, + STBTT_MS_LANG_HEBREW = 0x040d, STBTT_MS_LANG_SWEDISH = 0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH = 0, STBTT_MAC_LANG_JAPANESE = 11, + STBTT_MAC_LANG_ARABIC = 12, STBTT_MAC_LANG_KOREAN = 23, + STBTT_MAC_LANG_DUTCH = 4, STBTT_MAC_LANG_RUSSIAN = 32, + STBTT_MAC_LANG_FRENCH = 1, STBTT_MAC_LANG_SPANISH = 6, + STBTT_MAC_LANG_GERMAN = 2, STBTT_MAC_LANG_SWEDISH = 5, + STBTT_MAC_LANG_HEBREW = 10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, + STBTT_MAC_LANG_ITALIAN = 3, STBTT_MAC_LANG_CHINESE_TRAD = 19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE + #define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 + #error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE - 1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION + #define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER + #define STBTT__NOTUSED(v) (void)(v) +#else + #define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + ++b->cursor; + return result; +#else + return b->data[b->cursor++]; +#endif + +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + return result; +#else + return b->data[b->cursor]; +#endif + +} + +static void stbtt__buf_seek(stbtt__buf * b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf * b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf * b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for(i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} +#ifdef STBTT_STREAM_TYPE + static stbtt__buf stbtt__new_buf(STBTT_STREAM_TYPE s, size_t size) +#else + static stbtt__buf stbtt__new_buf(const void * p, size_t size) +#endif +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); +#ifdef STBTT_STREAM_TYPE + r.data = s; + r.offset = 0; +#else + r.data = (stbtt_uint8 *)p; +#endif + r.size = (int)size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf * b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if(o < 0 || s < 0 || o > b->size || s > b->size - o) return r; +#ifdef STBTT_STREAM_TYPE + r.data = b->data; + r.offset = b->offset + o; +#else + r.data = b->data + o; +#endif + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf * b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if(count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf * b) +{ + int b0 = stbtt__buf_get8(b); + if(b0 >= 32 && b0 <= 246) return b0 - 139; + else if(b0 >= 247 && b0 <= 250) return (b0 - 247) * 256 + stbtt__buf_get8(b) + 108; + else if(b0 >= 251 && b0 <= 254) return -(b0 - 251) * 256 - stbtt__buf_get8(b) - 108; + else if(b0 == 28) return stbtt__buf_get16(b); + else if(b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf * b) +{ + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if(b0 == 30) { + stbtt__buf_skip(b, 1); + while(b->cursor < b->size) { + v = stbtt__buf_get8(b); + if((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } + else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf * b, int key) +{ + stbtt__buf_seek(b, 0); + while(b->cursor < b->size) { + int start = b->cursor, end, op; + while(stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if(op == 12) op = stbtt__buf_get8(b) | 0x100; + if(op == key) return stbtt__buf_range(b, start, end - start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf * b, int key, int outcount, stbtt_uint32 * out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for(i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf * b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i * offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2 + (count + 1) * offsize + start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + + +#ifdef STBTT_STREAM_TYPE +static stbtt_uint8 ttBYTE(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r; + STBTT_STREAM_READ(s, &r, 1); + return r; +} +#define ttCHAR(s, offset) ((stbtt_int8)ttBYTE(s,offset)) +static stbtt_uint16 ttUSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_int16 ttSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_uint32 ttULONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +static stbtt_int32 ttLONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +#else +#define ttBYTE(p, offset) (* (stbtt_uint8 *) (p+offset)) +#define ttCHAR(p, offset) (* (stbtt_int8 *) (p+offset)) +static stbtt_uint16 ttUSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_int16 ttSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_uint32 ttULONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +static stbtt_int32 ttLONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +#endif +#define ttFixed(p, offset) ttLONG(p, offset) + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) +#ifdef STBTT_STREAM_TYPE + static int stbtt__isfont(STBTT_STREAM_TYPE stream, stbtt_uint32 offs) +#else + static int stbtt__isfont(stbtt_uint8 * font, stbtt_uint32 offs) +#endif +{ +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 font[4]; + STBTT_STREAM_SEEK(stream, offs); + STBTT_STREAM_READ(stream, font, 4); +#else + font += offs; +#endif + // check the version number + if(stbtt_tag4(font, '1', 0, 0, 0)) return 1; // TrueType 1 + if(stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if(stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if(stbtt_tag4(font, 0, 1, 0, 0)) return 1; // OpenType 1.0 + if(stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +#ifdef STBTT_STREAM_TYPE + static stbtt_uint32 stbtt__find_table(STBTT_STREAM_TYPE data, stbtt_uint32 fontstart, const char * tag) +#else + static stbtt_uint32 stbtt__find_table(stbtt_uint8 * data, stbtt_uint32 fontstart, const char * tag) +#endif +{ + stbtt_int32 num_tables = ttUSHORT(data, fontstart + 4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for(i = 0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16 * i; +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(data, loc + 0); + STBTT_STREAM_READ(data, buf, 4); + if(stbtt_tag(buf, tag)) + return ttULONG(data, loc + 8); +#else + if(stbtt_tag(data + loc + 0, tag)) + return ttULONG(data, loc + 8); +#endif + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetFontOffsetForIndex_internal(STBTT_STREAM_TYPE font_collection, int index) +#else + static int stbtt_GetFontOffsetForIndex_internal(unsigned char * font_collection, int index) +#endif +{ + // if it's just a font, there's only one valid index + if(stbtt__isfont(font_collection, 0)) + return index == 0 ? 0 : -1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection, 8); + if(index >= n) + return -1; + return ttULONG(font_collection, 12 + index * 4); + } + } + return -1; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetNumberOfFonts_internal(STBTT_STREAM_TYPE font_collection) +#else + static int stbtt_GetNumberOfFonts_internal(unsigned char * font_collection) +#endif +{ + // if it's just a font, there's only one valid font + if(stbtt__isfont(font_collection, 0)) + return 1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + return ttLONG(font_collection, 8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if(!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if(!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1] + subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo * info) +{ + stbtt_uint32 t; + if(info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if(t) { + stbtt_uint32 offset = ttULONG(info->data, t + 2); + info->svg = t + offset; + } + else { + info->svg = 0; + } + } + return info->svg; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_InitFont_internal(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int fontstart) +#else + static int stbtt_InitFont_internal(stbtt_fontinfo * info, unsigned char * data, int fontstart) +#endif +{ + stbtt_uint32 cmap, t; + stbtt_int32 i, numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if(!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if(info->glyf) { + // required for truetype + if(!info->loca) return 0; + } + else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if(!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + +#ifdef STBTT_STREAM_TYPE + info->cff = stbtt__new_buf(info->data, 512 * 1024 * 1024); + info->cff.offset = cff; +#else + info->cff = stbtt__new_buf(info->data + cff, 512 * 1024 * 1024); +#endif + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if(cstype != 2) return 0; + if(charstrings == 0) return 0; + + if(fdarrayoff) { + // looks like a CID font + if(!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size - fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if(t) + info->numGlyphs = ttUSHORT(data, t + 4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data, cmap + 2); + info->index_map = 0; + for(i = 0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data, encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch(ttUSHORT(data, encoding_record + 2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + } + if(info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data, info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint) +{ +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data, index_map + 0); + if(format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data, index_map + 2); + if(unicode_codepoint < bytes - 6) + return ttBYTE(data, index_map + 6 + unicode_codepoint); + return 0; + } + else if(format == 6) { + stbtt_uint32 first = ttUSHORT(data, index_map + 6); + stbtt_uint32 count = ttUSHORT(data, index_map + 8); + if((stbtt_uint32)unicode_codepoint >= first && (stbtt_uint32)unicode_codepoint < first + count) + return ttUSHORT(data, index_map + 10 + (unicode_codepoint - first) * 2); + return 0; + } + else if(format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } + else if(format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data, index_map + 6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data, index_map + 8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data, index_map + 10); + stbtt_uint16 rangeShift = ttUSHORT(data, index_map + 12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if(unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if(unicode_codepoint >= ttUSHORT(data, search + rangeShift * 2)) + search += rangeShift * 2; + + // now decrement to bias correctly to find smallest + search -= 2; + while(entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data, search + searchRange * 2); + if(unicode_codepoint > end) + search += searchRange * 2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16)((search - endCount) >> 1); + + start = ttUSHORT(data, index_map + 14 + segcount * 2 + 2 + 2 * item); + last = ttUSHORT(data, endCount + 2 * item); + if(unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data, index_map + 14 + segcount * 6 + 2 + 2 * item); + if(offset == 0) + return (stbtt_uint16)(unicode_codepoint + ttSHORT(data, index_map + 14 + segcount * 4 + 2 + 2 * item)); + + return ttUSHORT(data, offset + (unicode_codepoint - start) * 2 + index_map + 14 + segcount * 6 + 2 + 2 * item); + } + } + else if(format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data, index_map + 12); + stbtt_int32 low, high; + low = 0; + high = (stbtt_int32)ngroups; + // Binary search the right group. + while(low < high) { + stbtt_int32 mid = low + ((high - low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data, index_map + 16 + mid * 12); + stbtt_uint32 end_char = ttULONG(data, index_map + 16 + mid * 12 + 4); + if((stbtt_uint32)unicode_codepoint < start_char) + high = mid; + else if((stbtt_uint32)unicode_codepoint > end_char) + low = mid + 1; + else { + stbtt_uint32 start_glyph = ttULONG(data, index_map + 16 + mid * 12 + 8); + if(format == 12) + return start_glyph + unicode_codepoint - start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex * *vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex * v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16)x; + v->y = (stbtt_int16)y; + v->cx = (stbtt_int16)cx; + v->cy = (stbtt_int16)cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo * info, int glyph_index) +{ + int g1, g2; + + STBTT_assert(!info->cff.size); + + if(glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if(info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if(info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2 + 2) * 2; + } + else { + g1 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4 + 4); + } + + return g1 == g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + if(info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } + else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 0; + + if(x0) *x0 = ttSHORT(info->data, g + 2); + if(y0) *y0 = ttSHORT(info->data, g + 4); + if(x1) *x1 = ttSHORT(info->data, g + 6); + if(y1) *y1 = ttSHORT(info->data, g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info, codepoint), x0, y0, x1, y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if(info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 1; + numberOfContours = ttSHORT(info->data, g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex * vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if(start_off) { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + scx) >> 1, (cy + scy) >> 1, cx, cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, scx, scy); + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, sx, sy, 0, 0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint32 endPtsOfContours; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_vertex * vertices = 0; + int num_vertices = 0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if(g < 0) return 0; + + numberOfContours = ttSHORT(data, g); + + if(numberOfContours > 0) { + stbtt_uint8 flags = 0, flagcount; + stbtt_int32 ins, i, j = 0, m, n, next_move, was_off = 0, off, start_off = 0; + stbtt_int32 x, y, cx, cy, sx, sy, scx, scy; + stbtt_uint32 points; + endPtsOfContours = (g + 10); + ins = ttUSHORT(data, g + 10 + numberOfContours * 2); + points = g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1 + ttUSHORT(data, endPtsOfContours + numberOfContours * 2 - 2); + + m = n + 2 * numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *)STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if(vertices == 0) + return 0; + + next_move = 0; + flagcount = 0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for(i = 0; i < n; ++i) { + if(flagcount == 0) { + flags = ttBYTE(data, points++); + if(flags & 8) + flagcount = ttBYTE(data, points++); + } + else + --flagcount; + vertices[off + i].type = flags; + } + + // now load x coordinates + x = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 2) { + stbtt_int16 dx = ttBYTE(data, points++); + x += (flags & 16) ? dx : -dx; // ??? + } + else { + if(!(flags & 16)) { + x = x + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].x = (stbtt_int16)x; + } + + // now load y coordinates + y = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 4) { + stbtt_int16 dy = ttBYTE(data, points++); + y += (flags & 32) ? dy : -dy; // ??? + } + else { + if(!(flags & 32)) { + y = y + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].y = (stbtt_int16)y; + } + + // now convert them to our format + num_vertices = 0; + sx = sy = cx = cy = scx = scy = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + x = (stbtt_int16)vertices[off + i].x; + y = (stbtt_int16)vertices[off + i].y; + + if(next_move == i) { + if(i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + + // now start the new one + start_off = !(flags & 1); + if(start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if(!(vertices[off + i + 1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32)vertices[off + i + 1].x) >> 1; + sy = (y + (stbtt_int32)vertices[off + i + 1].y) >> 1; + } + else { + // otherwise just use the next point as our start point + sx = (stbtt_int32)vertices[off + i + 1].x; + sy = (stbtt_int32)vertices[off + i + 1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } + else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove, sx, sy, 0, 0); + was_off = 0; + next_move = 1 + ttUSHORT(data, endPtsOfContours + j * 2); + ++j; + } + else { + if(!(flags & 1)) { // if it's a curve + if(was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + x) >> 1, (cy + y) >> 1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x, y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x, y, 0, 0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + } + else if(numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint32 comp = g + 10; + num_vertices = 0; + vertices = 0; + while(more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex * comp_verts = 0, * tmp = 0; + float mtx[6] = { 1, 0, 0, 1, 0, 0 }, m, n; + + flags = ttSHORT(data, comp); + comp += 2; + gidx = ttSHORT(data, comp); + comp += 2; + + if(flags & 2) { // XY values + if(flags & 1) { // shorts + mtx[4] = ttSHORT(data, comp); + comp += 2; + mtx[5] = ttSHORT(data, comp); + comp += 2; + } + else { + mtx[4] = ttCHAR(data, comp); + comp += 1; + mtx[5] = ttCHAR(data, comp); + comp += 1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if(flags & (1 << 3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + } + else if(flags & (1 << 6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + else if(flags & (1 << 7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[2] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + + // Find transformation scales. + m = (float)STBTT_sqrt(mtx[0] * mtx[0] + mtx[1] * mtx[1]); + n = (float)STBTT_sqrt(mtx[2] * mtx[2] + mtx[3] * mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if(comp_num_verts > 0) { + // Transform vertices. + for(i = 0; i < comp_num_verts; ++i) { + stbtt_vertex * v = &comp_verts[i]; + stbtt_vertex_type x, y; + x = v->x; + y = v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + x = v->cx; + y = v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex *)STBTT_malloc((num_vertices + comp_num_verts) * sizeof(stbtt_vertex), info->userdata); + if(!tmp) { + if(vertices) STBTT_free(vertices, info->userdata); + if(comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if(num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices * sizeof(stbtt_vertex)); + STBTT_memcpy(tmp + num_vertices, comp_verts, comp_num_verts * sizeof(stbtt_vertex)); + if(vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1 << 5); + } + } + else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct { + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex * pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx * c, stbtt_int32 x, stbtt_int32 y) +{ + if(x > c->max_x || !c->started) c->max_x = x; + if(y > c->max_y || !c->started) c->max_y = y; + if(x < c->min_x || !c->started) c->min_x = x; + if(y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx * c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if(c->bounds) { + stbtt__track_vertex(c, x, y); + if(type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } + else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16)cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16)cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx * ctx) +{ + if(ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx * ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx * ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx * ctx, float dx1, float dy1, float dx2, float dy2, float dx3, + float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if(count >= 33900) + bias = 32768; + else if(count >= 1240) + bias = 1131; + n += bias; + if(n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if(fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } + else if(fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for(i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if(glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if(fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo * info, int glyph_index, stbtt__csctx * c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while(b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch(b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if(in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if(sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 2], s[sp - 1]); + break; + case 0x04: // vmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp - 1]); + break; + case 0x16: // hmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 1], 0); + break; + + case 0x05: // rlineto + if(sp < 2) return STBTT__CSERR("rlineto stack"); + for(; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if(sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if(sp < 1) return STBTT__CSERR("hlineto stack"); + for(;;) { + if(i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; +vlineto: + if(i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if(sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if(sp < 4) return STBTT__CSERR("vhcurveto stack"); + for(;;) { + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i + 1], s[i + 2], s[i + 3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; +hvcurveto: + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i + 1], s[i + 2], (sp - i == 5) ? s[i + 4] : 0.0f, s[i + 3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if(sp < 6) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x18: // rcurveline + if(sp < 8) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + if(i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + case 0x19: // rlinecurve + if(sp < 8) return STBTT__CSERR("rlinecurve stack"); + for(; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + if(i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if(sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if(sp & 1) { + f = s[i]; + i++; + } + for(; i + 3 < sp; i += 4) { + if(b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i + 1], s[i + 2], s[i + 3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i + 1], s[i + 2], 0.0, s[i + 3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if(!has_subrs) { + if(info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if(sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int)s[--sp]; + if(subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if(b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if(subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch(b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if(sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if(sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if(sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5)); + break; + + case 0x25: // flex1 + if(sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1 + dx2 + dx3 + dx4 + dx5; + dy = dy1 + dy2 + dy3 + dy4 + dy5; + if(STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } + break; + + default: + if(b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if(b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } + else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if(sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if(clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if(stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex *)STBTT_malloc(count_ctx.num_vertices * sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if(stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if(x0) *x0 = r ? c.min_x : 0; + if(y0) *y0 = r ? c.min_y : 0; + if(x1) *x1 = r ? c.max_x : 0; + if(y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + if(!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data, info->hhea + 34); + if(glyph_index < numOfLongHorMetrics) { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * glyph_index); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, info->hmtx + 4 * glyph_index + 2); + } + else { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * (numOfLongHorMetrics - 1)); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, + info->hmtx + 4 * numOfLongHorMetrics + 2 * (glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info) +{ + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(info->data, 10 + info->kern); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length) +{ + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(info->data, 10 + info->kern); + if(table_length < length) + length = table_length; + + for(k = 0; k < length; k++) { + table[k].glyph1 = ttUSHORT(info->data, 18 + (k * 6) + info->kern); + table[k].glyph2 = ttUSHORT(info->data, 20 + (k * 6) + info->kern); + table[k].advance = ttSHORT(info->data, 22 + (k * 6) + info->kern); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, info->kern + 2) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, info->kern + 8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(info->data, info->kern + 10) - 1; + needle = glyph1 << 16 | glyph2; + while(l <= r) { + m = (l + r) >> 1; + straw = ttULONG(info->data, info->kern + 18 + (m * 6)); // note: unaligned read + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else + return ttSHORT(info->data, info->kern + 22 + (m * 6)); + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetCoverageIndex(STBTT_STREAM_TYPE data, stbtt_uint32 coverageTable, int glyph) +#else + static stbtt_int32 stbtt__GetCoverageIndex(const stbtt_uint8 * data, stbtt_uint32 coverageTable, int glyph) +#endif +{ + stbtt_uint16 coverageFormat = ttUSHORT(data, coverageTable); + switch(coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(data, coverageTable + 2); + + // Binary search. + stbtt_int32 l = 0, r = glyphCount - 1, m; + int straw, needle = glyph; + while(l <= r) { + stbtt_uint32 glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(data, glyphArray + 2 * m); + straw = glyphID; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(data, coverageTable + 2); + stbtt_uint32 rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = rangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(data, rangeRecord); + strawEnd = ttUSHORT(data, rangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(data, rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: + return -1; // unsupported + } + + return -1; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetGlyphClass(STBTT_STREAM_TYPE data, stbtt_uint32 classDefTable, int glyph) +#else + static stbtt_int32 stbtt__GetGlyphClass(const stbtt_uint8 * data, stbtt_uint32 classDefTable, int glyph) +#endif +{ + stbtt_uint16 classDefFormat = ttUSHORT(data, classDefTable); + switch(classDefFormat) { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(data, classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(data, classDefTable + 4); + stbtt_uint32 classDef1ValueArray = classDefTable + 6; + + if(glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(data, classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(data, classDefTable + 2); + stbtt_uint32 classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = classRangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(data, classRangeRecord); + strawEnd = ttUSHORT(data, classRangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(data, classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint32 lookupList; + stbtt_uint16 lookupCount; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + const stbtt_uint8 * data = info->data; +#endif + stbtt_int32 i, sti; + + if(!info->gpos) return 0; + + if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 + if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data, 8 + info->gpos); + lookupList = lookupListOffset; + lookupCount = ttUSHORT(data, lookupList); + + for(i = 0; i < lookupCount; ++i) { + stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); + stbtt_uint32 lookupTable = lookupList + lookupOffset; + + stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); + stbtt_uint16 subTableCount = ttUSHORT(data, lookupTable + 4); + stbtt_uint32 subTableOffsets = lookupTable + 6; + if(lookupType != 2) // Pair Adjustment Positioning Subtable + continue; + + for(sti = 0; sti < subTableCount; sti++) { + stbtt_uint16 subtableOffset = ttUSHORT(data, subTableOffsets + 2 * sti); + stbtt_uint32 table = lookupTable + subtableOffset; + stbtt_uint16 posFormat = ttUSHORT(data, table); + stbtt_uint16 coverageOffset = ttUSHORT(data, table + 2); + stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(data, table + coverageOffset, glyph1); + if(coverageIndex == -1) continue; + + switch(posFormat) { + case 1: { + stbtt_int32 l, r, m; + int straw, needle; + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_int32 valueRecordPairSizeInBytes = 2; + stbtt_uint16 pairSetCount = ttUSHORT(data, table + 8); + stbtt_uint16 pairPosOffset = ttUSHORT(data, table + 10 + 2 * coverageIndex); + stbtt_uint32 pairValueTable = table + pairPosOffset; + stbtt_uint16 pairValueCount = ttUSHORT(data, pairValueTable); + stbtt_uint32 pairValueArray = pairValueTable + 2; + + if(coverageIndex >= pairSetCount) return 0; + + needle = glyph2; + r = pairValueCount - 1; + l = 0; + + // Binary search. + while(l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint32 pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(data, pairValue); + straw = secondGlyph; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(data, pairValue + 2); + return xAdvance; + } + } + } + else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(data, table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(data, table + 10); + int glyph1class = stbtt__GetGlyphClass(data, table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(data, table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(data, table + 12); + stbtt_uint16 class2Count = ttUSHORT(data, table + 14); + stbtt_uint32 class1Records, class2Records; + stbtt_int16 xAdvance; + + if(glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if(glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(data, class2Records + 2 * glyph2class); + return xAdvance; + } + else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int g1, int g2) +{ + int xAdvance = 0; + + if(info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if(info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2) +{ + if(!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info, ch1), stbtt_FindGlyphIndex(info, ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info, codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap) +{ + if(ascent) *ascent = ttSHORT(info->data, info->hhea + 4); + if(descent) *descent = ttSHORT(info->data, info->hhea + 6); + if(lineGap) *lineGap = ttSHORT(info->data, info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if(!tab) + return 0; + if(typoAscent) *typoAscent = ttSHORT(info->data, tab + 68); + if(typoDescent) *typoDescent = ttSHORT(info->data, tab + 70); + if(typoLineGap) *typoLineGap = ttSHORT(info->data, tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1) +{ + *x0 = ttSHORT(info->data, info->head + 36); + *y0 = ttSHORT(info->data, info->head + 38); + *x1 = ttSHORT(info->data, info->head + 40); + *y1 = ttSHORT(info->data, info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float height) +{ + int fheight = ttSHORT(info->data, info->hhea + 4) - ttSHORT(info->data, info->hhea + 6); + return (float)height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data, info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl) +{ + int i; + stbtt_uint32 svg_doc_list = stbtt__get_svg((stbtt_fontinfo *)info); + + int numEntries = ttUSHORT(info->data, svg_doc_list); + stbtt_uint32 svg_docs = svg_doc_list + 2; + + for(i = 0; i < numEntries; i++) { + stbtt_uint32 svg_doc = svg_docs + (12 * i); + if((gl >= ttUSHORT(info->data, svg_doc)) && (gl <= ttUSHORT(info->data, svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs) +{ + stbtt_uint32 svg_doc; + + if(info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if(svg_doc != 0) { + *svgOfs = info->svg + ttULONG(info->data, svg_doc + 4); + return ttULONG(info->data, svg_doc + 8); + } + else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svgOfs); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + int x0 = 0, y0 = 0, x1, y1; // =0 suppresses compiler warning + if(!stbtt_GetGlyphBox(font, glyph, &x0, &y0, &x1, &y1)) { + // e.g. space character + if(ix0) *ix0 = 0; + if(iy0) *iy0 = 0; + if(ix1) *ix1 = 0; + if(iy1) *iy1 = 0; + } + else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if(ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if(iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if(ix1) *ix1 = STBTT_iceil(x1 * scale_x + shift_x); + if(iy1) *iy1 = STBTT_iceil(-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font, codepoint), scale_x, scale_y, shift_x, shift_y, ix0, + iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk { + struct stbtt__hheap_chunk * next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap { + struct stbtt__hheap_chunk * head; + void * first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void * stbtt__hheap_alloc(stbtt__hheap * hh, size_t size, void * userdata) +{ + if(hh->first_free) { + void * p = hh->first_free; + hh->first_free = *(void **)p; + return p; + } + else { + if(hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? STBTT_HEAP_FACTOR_SIZE_32 : size < 128 ? STBTT_HEAP_FACTOR_SIZE_128 : + STBTT_HEAP_FACTOR_SIZE_DEFAULT); + stbtt__hheap_chunk * c = (stbtt__hheap_chunk *)STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if(c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *)(hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap * hh, void * p) +{ + *(void **)p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap * hh, void * userdata) +{ + stbtt__hheap_chunk * c = hh->head; + while(c) { + stbtt__hheap_chunk * n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0, y0, x1, y1; + int invert; +} stbtt__edge; + + +typedef struct stbtt__active_edge { + struct stbtt__active_edge * next; +#if STBTT_RASTERIZER_VERSION==1 + int x, dx; + float ey; + int direction; +#elif STBTT_RASTERIZER_VERSION==2 + float fx, fdx, fdy; + float direction; + float sy; + float ey; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if(!z) return z; + + // round dx down to avoid overshooting + if(dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - + e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if(!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f / dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char * scanline, int len, stbtt__active_edge * e, int max_weight) +{ + // non-zero winding fill + int x0 = 0, w = 0; + + while(e) { + if(w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; + w += e->direction; + } + else { + int x1 = e->x; + w += e->direction; + // if we went to zero, we need to draw + if(w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if(i < len && j >= 0) { + if(i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8)((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } + else { + if(i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8)(((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if(j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8)(((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for(++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8)max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], * scanline; + + if(result->w > 512) + scanline = (unsigned char *)STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float)vsubsample + 1; + + while(j < result->h) { + STBTT_memset(scanline, 0, result->w); + for(s = 0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge ** step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed = 0; + step = &active; + while(*step && (*step)->next) { + if((*step)->x > (*step)->next->x) { + stbtt__active_edge * t = *step; + stbtt__active_edge * q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if(!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while(e->y0 <= scan_y) { + if(e->y1 > scan_y) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if(z != NULL) { + // find insertion point + if(active == NULL) + active = z; + else if(z->x < active->x) { + // insert at front + z->next = active; + active = z; + } + else { + // find thing to insert AFTER + stbtt__active_edge * p = active; + while(p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if(active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float * scanline, int x, stbtt__active_edge * e, float x0, float y0, float x1, + float y1) +{ + if(y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if(y0 > e->ey) return; + if(y1 < e->sy) return; + if(y0 < e->sy) { + x0 += (x1 - x0) * (e->sy - y0) / (y1 - y0); + y0 = e->sy; + } + if(y1 > e->ey) { + x1 += (x1 - x0) * (e->ey - y1) / (y1 - y0); + y1 = e->ey; + } + + if(x0 == x) + STBTT_assert(x1 <= x + 1); + else if(x0 == x + 1) + STBTT_assert(x1 >= x); + else if(x0 <= x) + STBTT_assert(x1 <= x); + else if(x0 >= x + 1) + STBTT_assert(x1 >= x + 1); + else + STBTT_assert(x1 >= x && x1 <= x + 1); + + if(x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1 - y0); + else if(x0 >= x + 1 && x1 >= x + 1) { + /*Nothing to do*/; + } + else { + STBTT_assert(x0 >= x && x0 <= x + 1 && x1 >= x && x1 <= x + 1); + scanline[x] += e->direction * (y1 - y0) * (1 - ((x0 - x) + (x1 - x)) / 2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float * scanline, float * scanline_fill, int len, stbtt__active_edge * e, + float y_top) +{ + float y_bottom = y_top + 1; + + while(e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if(e->fdx == 0) { + float x0 = e->fx; + if(x0 < len) { + if(x0 >= 0) { + stbtt__handle_clipped_edge(scanline, (int)x0, e, x0, y_top, x0, y_bottom); + stbtt__handle_clipped_edge(scanline_fill - 1, (int)x0 + 1, e, x0, y_top, x0, y_bottom); + } + else { + stbtt__handle_clipped_edge(scanline_fill - 1, 0, e, x0, y_top, x0, y_bottom); + } + } + } + else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0, sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if(e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } + else { + x_top = x0; + sy0 = y_top; + } + if(e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } + else { + x_bottom = xb; + sy1 = y_bottom; + } + + if(x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if((int)x_top == (int)x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int)x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x + 1.0f, x_bottom, x + 1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } + else { + int x, x1, x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if(x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int)x_top; + x2 = (int)x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1 + 1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if(y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing - sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1 + 1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if(y_final > y_bottom) { + y_final = y_bottom; + dy = (y_final - y_crossing) / (x2 - (x1 + 1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for(x = x1 + 1; x < x2; ++x) { + scanline[x] += area + step / 2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final - 0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1 - y_final, (float)x2, x2 + 1.0f, x_bottom, x2 + 1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1 - sy0); + } + } + else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for(x = 0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float)(x); + float x2 = (float)(x + 1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x + 1 - x0) / dx + y_top; + + if(x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else { // one segment + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x3, y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0, i; + float scanline_data[129], * scanline, * scanline2; + + STBTT__NOTUSED(vsubsample); + + if(result->w > 64) + scanline = (float *)STBTT_malloc((result->w * 2 + 1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float)(off_y + result->h) + 1; + + while(j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge ** step = &active; + + STBTT_memset(scanline, 0, result->w * sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w + 1) * sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while(e->y0 <= scan_y_bottom) { + if(e->y0 != e->y1) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if(z != NULL) { + if(j == 0 && off_y != 0) { + if(z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if(active) + stbtt__fill_active_edges_new(scanline, scanline2 + 1, result->w, active, scan_y_top); + + { + float sum = 0; + for(i = 0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float)STBTT_fabs(k) * 255 + 0.5f; + m = (int)k; + if(m > 255) m = 255; + result->pixels[j * result->stride + i] = (unsigned char)m; + } + } + // advance all the edges + step = &active; + while(*step) { + stbtt__active_edge * z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge * p, int n) +{ + int i, j; + for(i = 1; i < n; ++i) { + stbtt__edge t = p[i], * a = &t; + j = i; + while(j > 0) { + stbtt__edge * b = &p[j - 1]; + int c = STBTT__COMPARE(a, b); + if(!c) break; + p[j] = p[j - 1]; + --j; + } + if(i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge * p, int n) +{ + /* threshold for transitioning to insertion sort */ + while(n > 12) { + stbtt__edge t; + int c01, c12, c, m, i, j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0], &p[m]); + c12 = STBTT__COMPARE(&p[m], &p[n - 1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if(c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0], &p[n - 1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n - 1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i = 1; + j = n - 1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for(;; ++i) { + if(!STBTT__COMPARE(&p[i], &p[0])) break; + } + for(;; --j) { + if(!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if(i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if(j < (n - i)) { + stbtt__sort_edges_quicksort(p, j); + p = p + i; + n = n - i; + } + else { + stbtt__sort_edges_quicksort(p + i, n - i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge * p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct { + float x, y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap * result, stbtt__point * pts, int * wcount, int windings, float scale_x, + float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void * userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge * e; + int n, i, j, k, m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for(i = 0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *)STBTT_malloc(sizeof(*e) * (n + 1), userdata); // add an extra one as a sentinel + if(e == 0) return; + n = 0; + + m = 0; + for(i = 0; i < windings; ++i) { + stbtt__point * p = pts + m; + m += wcount[i]; + j = wcount[i] - 1; + for(k = 0; k < wcount[i]; j = k++) { + int a = k, b = j; + // skip the edge if horizontal + if(p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if(invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a = j, b = k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point * points, int n, float x, float y) +{ + if(!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2 * x1 + x2) / 4; + float my = (y0 + 2 * y1 + y2) / 4; + // versus directly drawn line + float dx = (x0 + x2) / 2 - mx; + float dy = (y0 + y2) / 2 - my; + if(n > 16) // 65536 segments on one curve better be enough! + return 1; + if(dx * dx + dy * dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0, y0, (x0 + x1) / 2.0f, (y0 + y1) / 2.0f, mx, my, + objspace_flatness_squared, n + 1); + stbtt__tesselate_curve(points, num_points, mx, my, (x1 + x2) / 2.0f, (y1 + y2) / 2.0f, x2, y2, + objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x2, y2); + *num_points = *num_points + 1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1 - x0; + float dy0 = y1 - y0; + float dx1 = x2 - x1; + float dy1 = y2 - y1; + float dx2 = x3 - x2; + float dy2 = y3 - y2; + float dx = x3 - x0; + float dy = y3 - y0; + float longlen = (float)(STBTT_sqrt(dx0 * dx0 + dy0 * dy0) + STBTT_sqrt(dx1 * dx1 + dy1 * dy1) + STBTT_sqrt( + dx2 * dx2 + dy2 * dy2)); + float shortlen = (float)STBTT_sqrt(dx * dx + dy * dy); + float flatness_squared = longlen * longlen - shortlen * shortlen; + + if(n > 16) // 65536 segments on one curve better be enough! + return; + + if(flatness_squared > objspace_flatness_squared) { + float x01 = (x0 + x1) / 2; + float y01 = (y0 + y1) / 2; + float x12 = (x1 + x2) / 2; + float y12 = (y1 + y2) / 2; + float x23 = (x2 + x3) / 2; + float y23 = (y2 + y3) / 2; + + float xa = (x01 + x12) / 2; + float ya = (y01 + y12) / 2; + float xb = (x12 + x23) / 2; + float yb = (y12 + y23) / 2; + + float mx = (xa + xb) / 2; + float my = (ya + yb) / 2; + + stbtt__tesselate_cubic(points, num_points, x0, y0, x01, y01, xa, ya, mx, my, objspace_flatness_squared, n + 1); + stbtt__tesselate_cubic(points, num_points, mx, my, xb, yb, x23, y23, x3, y3, objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x3, y3); + *num_points = *num_points + 1; + } +} + +// returns number of contours +static stbtt__point * stbtt_FlattenCurves(stbtt_vertex * vertices, int num_verts, float objspace_flatness, + int ** contour_lengths, int * num_contours, void * userdata) +{ + stbtt__point * points = 0; + int num_points = 0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i, n = 0, start = 0, pass; + + // count how many "moves" there are to get the contour count + for(i = 0; i < num_verts; ++i) + if(vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if(n == 0) return 0; + + *contour_lengths = (int *)STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if(*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for(pass = 0; pass < 2; ++pass) { + float x = 0, y = 0; + if(pass == 1) { + points = (stbtt__point *)STBTT_malloc(num_points * sizeof(points[0]), userdata); + if(points == NULL) goto error; + } + num_points = 0; + n = -1; + for(i = 0; i < num_verts; ++i) { + switch(vertices[i].type) { + case STBTT_vmove: + // start the next contour + if(n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, float flatness_in_pixels, stbtt_vertex * vertices, int num_verts, + float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void * userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int * winding_lengths = NULL; + stbtt__point * windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, + &winding_count, userdata); + if(windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, + invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff) +{ + int ix0, iy0, ix1, iy1; + stbtt__bitmap gbm; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if(scale_x == 0) scale_x = scale_y; + if(scale_y == 0) { + if(scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, &ix1, &iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if(width) *width = gbm.w; + if(height) *height = gbm.h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + if(gbm.w && gbm.h) { + gbm.pixels = (unsigned char *)STBTT_malloc(gbm.w * gbm.h, info->userdata); + if(gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0, iy0; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, 0, 0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if(gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, glyph); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint), + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, codepoint, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small +#ifdef STBTT_STREAM_TYPE +static int stbtt_BakeFontBitmap_internal(STBTT_STREAM_TYPE data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#else +static int stbtt_BakeFontBitmap_internal(unsigned char * data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#endif +{ + float scale; + int x, y, bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if(!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + x = y = 1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for(i = 0; i < num_chars; ++i) { + int advance, lsb, x0, y0, x1, y1, gw, gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale, scale, &x0, &y0, &x1, &y1); + gw = x1 - x0; + gh = y1 - y0; + if(x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if(y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x + gw < pw); + STBTT_assert(y + gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels + x + y * pw, gw, gh, pw, scale, scale, g); + chardata[i].x0 = (stbtt_int16)x; + chardata[i].y0 = (stbtt_int16)y; + chardata[i].x1 = (stbtt_int16)(x + gw); + chardata[i].y1 = (stbtt_int16)(y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float)x0; + chardata[i].yoff = (float)y0; + x = x + gw + 1; + if(y + gh + 1 > bottom_y) + bottom_y = y + gh + 1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar * b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct { + int width, height; + int x, y, bottom_y; +} stbrp_context; + +typedef struct { + unsigned char x; +} stbrp_node; + +struct stbrp_rect { + stbrp_coord x, y; + int id, w, h, was_packed; +}; + +static void stbrp_init_target(stbrp_context * con, int pw, int ph, stbrp_node * nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context * con, stbrp_rect * rects, int num_rects) +{ + int i; + for(i = 0; i < num_rects; ++i) { + if(con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if(con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if(con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for(; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int pw, int ph, int stride_in_bytes, + int padding, void * alloc_context) +{ + stbrp_context * context = (stbrp_context *)STBTT_malloc(sizeof(*context), alloc_context); + int num_nodes = pw - padding; + stbrp_node * nodes = (stbrp_node *)STBTT_malloc(sizeof(*nodes) * num_nodes, alloc_context); + + if(context == NULL || nodes == NULL) { + if(context != NULL) STBTT_free(context, alloc_context); + if(nodes != NULL) STBTT_free(nodes, alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw - padding, ph - padding, nodes, num_nodes); + + if(pixels) + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc) +{ + STBTT_free(spc->nodes, spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if(h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if(v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char)(total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < h; ++i) { + STBTT_assert(pixels[i * stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if(!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float) - (oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k; + int missing_glyph_added = 0; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char)spc->h_oversample; + ranges[i].v_oversample = (unsigned char)spc->v_oversample; + for(j = 0; j < ranges[i].num_chars; ++j) { + int x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if(glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } + else { + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + &x0, &y0, &x1, &y1); + rects[k].w = (stbrp_coord)(x1 - x0 + spc->padding + spc->h_oversample - 1); + rects[k].h = (stbrp_coord)(y1 - y0 + spc->padding + spc->v_oversample - 1); + if(glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, + float * sub_x, float * sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if(prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if(prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h, recip_v, sub_x, sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for(j = 0; j < ranges[i].num_chars; ++j) { + stbrp_rect * r = &rects[k]; + if(r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar * bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord)spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0, &y0, &x1, &y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w - spc->h_oversample + 1, + r->h - spc->v_oversample + 1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + glyph); + + if(spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if(spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16)r->x; + bc->y0 = (stbtt_int16)r->y; + bc->x1 = (stbtt_int16)(r->x + r->w); + bc->y1 = (stbtt_int16)(r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float)x0 * recip_h + sub_x; + bc->yoff = (float)y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if(glyph == 0) + missing_glyph = j; + } + else if(spc->skip_missing) { + return_value = 0; + } + else if(r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } + else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#endif + + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *)spc->pack_info, rects, num_rects); +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#endif +{ + stbtt_fontinfo info; + int i, j, n, return_value = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect * rects; + + // flag all characters as NOT packed + for(i = 0; i < num_ranges; ++i) + for(j = 0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for(i = 0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *)STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if(rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#endif +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#endif + + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#endif +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float)i_ascent * scale; + *descent = (float)i_descent * scale; + *lineGap = (float)i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar * b = chardata + char_index; + + if(align_to_integer) { + float x = (float)STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float)STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } + else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], + float hits[2][2]) +{ + float q0perp = q0[1] * ray[0] - q0[0] * ray[1]; + float q1perp = q1[1] * ray[0] - q1[0] * ray[1]; + float q2perp = q2[1] * ray[0] - q2[0] * ray[1]; + float roperp = orig[1] * ray[0] - orig[0] * ray[1]; + + float a = q0perp - 2 * q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if(a != 0.0f) { + float discr = b * b - a * c; + if(discr > 0.0f) { + float rcpna = -1 / a; + float d = (float)STBTT_sqrt(discr); + s0 = (b + d) * rcpna; + s1 = (b - d) * rcpna; + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + if(d > 0.0f && s1 >= 0.0f && s1 <= 1.0f) { + if(num_s == 0) s0 = s1; + ++num_s; + } + } + } + else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + } + + if(num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0] * ray[0] + ray[1] * ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0] * rayn_x + q0[1] * rayn_y; + float q1d = q1[0] * rayn_x + q1[1] * rayn_y; + float q2d = q2[0] * rayn_x + q2[1] * rayn_y; + float rod = orig[0] * rayn_x + orig[1] * rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0 * (2.0f - 2.0f * s0) * q10d + s0 * s0 * q20d; + hits[0][1] = a * s0 + b; + + if(num_s > 1) { + hits[1][0] = q0rd + s1 * (2.0f - 2.0f * s1) * q10d + s1 * s1 * q20d; + hits[1][1] = a * s1 + b; + return 2; + } + else { + return 1; + } + } +} + +static int equal(float * a, float * b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex * verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float)STBTT_fmod(y, 1.0f); + if(y_frac < 0.01f) + y += 0.01f; + else if(y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for(i = 0; i < nverts; ++i) { + if(verts[i].type == STBTT_vline) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].x, y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if(verts[i].type == STBTT_vcurve) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].cx, y1 = (int)verts[i].cy; + int x2 = (int)verts[i].x, y2 = (int)verts[i].y; + int ax = STBTT_min(x0, STBTT_min(x1, x2)), ay = STBTT_min(y0, STBTT_min(y1, y2)); + int by = STBTT_max(y0, STBTT_max(y1, y2)); + if(y > ay && y < by && x > ax) { + float q0[2], q1[2], q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if(equal(q0, q1) || equal(q1, q2)) { + x0 = (int)verts[i - 1].x; + y0 = (int)verts[i - 1].y; + x1 = (int)verts[i].x; + y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if(num_hits >= 1) + if(hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if(num_hits >= 2) + if(hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot(float x) +{ + if(x < 0) + return -(float)STBTT_pow(-x, 1.0f / 3.0f); + else + return (float)STBTT_pow(x, 1.0f / 3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float * r) +{ + float s = -a / 3; + float p = b - a * a / 3; + float q = a * (2 * a * a - 9 * b) / 27 + c; + float p3 = p * p * p; + float d = q * q + 4 * p3 / 27; + if(d >= 0) { + float z = (float)STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } + else { + float u = (float)STBTT_sqrt(-p / 3); + float v = (float)STBTT_acos(-STBTT_sqrt(-27 / p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float)STBTT_cos(v); + float n = (float)STBTT_cos(v - 3.141592f / 2) * 1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0, iy0, ix1, iy1; + int w, h; + unsigned char * data; + + if(scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f, 0.0f, &ix0, &iy0, &ix1, &iy1); + + // if empty, return NULL + if(ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if(width) *width = w; + if(height) *height = h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x, y, i, j; + float * precompute; + stbtt_vertex * verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *)STBTT_malloc(w * h, info->userdata); + precompute = (float *)STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for(i = 0, j = num_verts - 1; i < num_verts; j = i++) { + if(verts[i].type == STBTT_vline) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float x1 = verts[j].x * scale_x, y1 = verts[j].y * scale_y; + float dist = (float)STBTT_sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x * scale_x, y2 = verts[j].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float len2 = bx * bx + by * by; + if(len2 != 0.0f) + precompute[i] = 1.0f / (bx * bx + by * by); + else + precompute[i] = 0.0f; + } + else + precompute[i] = 0.0f; + } + + for(y = iy0; y < iy1; ++y) { + for(x = ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float)x + 0.5f; + float sy = (float)y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, + verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for(i = 0; i < num_verts; ++i) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + + if(verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i - 1].x * scale_x, y1 = verts[i - 1].y * scale_y; + + float dist, dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float)STBTT_fabs((x1 - x0) * (y0 - sy) - (y1 - y0) * (x0 - sx)) * precompute[i]; + STBTT_assert(i != 0); + if(dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1 - x0, dy = y1 - y0; + float px = x0 - sx, py = y0 - sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px * dx + py * dy) / (dx * dx + dy * dy); + if(t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[i - 1].x * scale_x, y2 = verts[i - 1].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float box_x0 = STBTT_min(STBTT_min(x0, x1), x2); + float box_y0 = STBTT_min(STBTT_min(y0, y1), y2); + float box_x1 = STBTT_max(STBTT_max(x0, x1), x2); + float box_y1 = STBTT_max(STBTT_max(y0, y1), y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if(sx > box_x0 - min_dist && sx < box_x1 + min_dist && sy > box_y0 - min_dist && sy < box_y1 + min_dist) { + int num = 0; + float ax = x1 - x0, ay = y1 - y0; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = { 0.f, 0.f, 0.f }; + float px, py, t, it, dist2; + float a_inv = precompute[i]; + if(a_inv == 0.0f) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3 * (ax * bx + ay * by); + float b = 2 * (ax * ax + ay * ay) + (mx * bx + my * by); + float c = mx * ax + my * ay; + if(a == 0.0f) { // if a is 0, it's linear + if(b != 0.0f) { + res[num++] = -c / b; + } + } + else { + float discriminant = b * b - 4 * a * c; + if(discriminant < 0) + num = 0; + else { + float root = (float)STBTT_sqrt(discriminant); + res[0] = (-b - root) / (2 * a); + res[1] = (-b + root) / (2 * a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } + else { + float b = 3 * (ax * bx + ay * by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2 * (ax * ax + ay * ay) + (mx * bx + my * by)) * a_inv; + float d = (mx * ax + my * ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + if(num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + } + } + } + if(winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if(val < 0) + val = 0; + else if(val > 255) + val = 255; + data[(y - iy0) * w + (x - ix0)] = (unsigned char)val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +#ifdef STBTT_STREAM_TYPE +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, STBTT_STREAM_TYPE s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#else +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, stbtt_uint8 * s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#endif +{ + stbtt_int32 i = 0; + + // convert utf16 to utf8 and compare the results while converting + while(len2) { + stbtt_uint16 ch = ttUSHORT(s2, s2offs); + if(ch < 0x80) { + if(i >= len1) return -1; + if(s1[i++] != ch) return -1; + } + else if(ch < 0x800) { + if(i + 1 >= len1) return -1; + if(s1[i++] != 0xc0 + (ch >> 6)) return -1; + if(s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } + else if(ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = ttUSHORT(s2, s2offs + 2); + if(i + 3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if(s1[i++] != 0xf0 + (c >> 18)) return -1; + if(s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c) & 0x3f)) return -1; + s2offs += 2; // plus another 2 below + len2 -= 2; + } + else if(ch >= 0xdc00 && ch < 0xe000) { + return -1; + } + else { + if(i + 2 >= len1) return -1; + if(s1[i++] != 0xe0 + (ch >> 12)) return -1; + if(s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((ch) & 0x3f)) return -1; + } + s2offs += 2; + len2 -= 2; + } + return i; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, s2, s2offs, len2); +} +#else +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, char * s2, stbtt_uint32 s2offs, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, (stbtt_uint8 *)s2, s2offs, len2); +} +#endif +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID) +{ + stbtt_int32 i, count, stringOffset; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(font->data, offset, "name"); + if(!nm) return 0; + + count = ttUSHORT(font->data, nm + 2); + stringOffset = nm + ttUSHORT(font->data, nm + 4); + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if(platformID == ttUSHORT(font->data, loc + 0) && encodingID == ttUSHORT(font->data, loc + 2) + && languageID == ttUSHORT(font->data, loc + 4) && nameID == ttUSHORT(font->data, loc + 6)) { + *length = ttUSHORT(font->data, loc + 8); + return stringOffset + ttUSHORT(font->data, loc + 10); + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt__matchpair(STBTT_STREAM_TYPE fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#else +static int stbtt__matchpair(stbtt_uint8 * fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#endif +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc, nm + 2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc, nm + 4); + + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc, loc + 6); + if(id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc, loc + 0), encoding = ttUSHORT(fc, loc + 2), language = ttUSHORT(fc, loc + 4); + + // is this a Unicode encoding? + if(platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc, loc + 8); + stbtt_int32 off = ttUSHORT(fc, loc + 10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc, stringOffset + off, slen); + if(matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if(i + 1 < count && ttUSHORT(fc, loc + 12 + 6) == next_id && ttUSHORT(fc, loc + 12) == platform && + ttUSHORT(fc, loc + 12 + 2) == encoding && ttUSHORT(fc, loc + 12 + 4) == language) { + slen = ttUSHORT(fc, loc + 12 + 8); + off = ttUSHORT(fc, loc + 12 + 10); + if(slen == 0) { + if(matchlen == nlen) + return 1; + } + else if(matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; +#ifdef STBTT_STREAM_TYPE + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, fc, stringOffset + off, + slen)) +#else + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, (char *)fc, + stringOffset + off, slen)) +#endif + return 1; + } + } + else { + // if nothing immediately following + if(matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt__matches(STBTT_STREAM_TYPE fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#else + static int stbtt__matches(stbtt_uint8 * fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#endif + +{ + stbtt_int32 nlen = (stbtt_int32)STBTT_strlen((char *)name); + stbtt_uint32 nm, hd; + if(!stbtt__isfont(fc, offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if(flags) { + hd = stbtt__find_table(fc, offset, "head"); + if((ttUSHORT(fc, hd + 44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if(!nm) return 0; + + if(flags) { + if(name == NULL) return 1; + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if(stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + else { + if(name == NULL) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_FindMatchingFont_internal(STBTT_STREAM_TYPE font_collection, char * name_utf8, stbtt_int32 flags) +#else + static int stbtt_FindMatchingFont_internal(unsigned char * font_collection, char * name_utf8, stbtt_int32 flags) +#endif +{ + stbtt_int32 i; + for(i = 0;; ++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if(off < 0) return off; +#ifdef STBTT_STREAM_TYPE + if(stbtt__matches(font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#else + if(stbtt__matches((stbtt_uint8 *)font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#endif + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-qual" +#endif + + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#endif +{ +#ifdef STBTT_STREAM_TYPE + return stbtt_BakeFontBitmap_internal(data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +#else + return stbtt_BakeFontBitmap_internal((unsigned char *)data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, + chardata); +#endif +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal(data, index); +} +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *)data, index); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data) +{ + return stbtt_GetNumberOfFonts_internal(data); +} +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *)data); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset) +{ + return stbtt_InitFont_internal(info, data, offset); +} +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *)data, offset); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal(fontdata, (char *)name, flags); +} +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *)fontdata, (char *)name, flags); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, s2, s2offs, len2); +} +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, (char *)s2, s2offs, len2); +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/lib/lvgl/src/extra/lv_extra.c b/lib/lvgl/src/extra/lv_extra.c index 0b50002..3808337 100644 --- a/lib/lvgl/src/extra/lv_extra.c +++ b/lib/lvgl/src/extra/lv_extra.c @@ -50,6 +50,10 @@ void lv_extra_init(void) lv_fs_fatfs_init(); #endif +#if LV_USE_FS_LITTLEFS != '\0' + lv_fs_littlefs_init(); +#endif + #if LV_USE_FS_STDIO != '\0' lv_fs_stdio_init(); #endif diff --git a/lib/lvgl/src/extra/lv_extra.mk b/lib/lvgl/src/extra/lv_extra.mk index 1afcc7b..8d418ad 100644 --- a/lib/lvgl/src/extra/lv_extra.mk +++ b/lib/lvgl/src/extra/lv_extra.mk @@ -1 +1 @@ -CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra -name \*.c) +CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra -name "*.c") diff --git a/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c b/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c index e8ee84f..ade7215 100644 --- a/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c +++ b/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c @@ -187,14 +187,15 @@ void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata) { LV_ASSERT_NULL(manager); - lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); - if(!top) return false; - lv_fragment_managed_states_t * states = top->states; - lv_fragment_t * instance = states->instance; - if(!instance) return false; - if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true; - if(!states->cls->event_cb) return false; - return states->cls->event_cb(instance, code, userdata); + lv_fragment_managed_states_t * p = NULL; + _LV_LL_READ_BACK(&manager->attached, p) { + if(!p->obj_created || p->destroying_obj) continue; + lv_fragment_t * instance = p->instance; + if(!instance) continue; + if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true; + if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true; + } + return false; } size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager) diff --git a/lib/lvgl/src/extra/others/gridnav/lv_gridnav.c b/lib/lvgl/src/extra/others/gridnav/lv_gridnav.c index 4eec637..505a977 100644 --- a/lib/lvgl/src/extra/others/gridnav/lv_gridnav.c +++ b/lib/lvgl/src/extra/others/gridnav/lv_gridnav.c @@ -217,6 +217,7 @@ static void gridnav_event_cb(lv_event_t * e) if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); if(dsc->focused_obj) { lv_obj_add_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_clear_state(dsc->focused_obj, LV_STATE_PRESSED); /*Be sure the focuses obj is not stuck in pressed state*/ lv_obj_scroll_to_view(dsc->focused_obj, LV_ANIM_OFF); } } diff --git a/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c b/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c index b1661e4..9834154 100644 --- a/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c +++ b/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c @@ -562,6 +562,8 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * lv_memset_00(pinyin_ime->py_num, sizeof(pinyin_ime->py_num)); lv_memset_00(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos)); + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55)); lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); @@ -576,6 +578,7 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); lv_btnmatrix_set_one_checked(pinyin_ime->cand_panel, true); + lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_CLICK_FOCUSABLE); /* Set cand_panel style*/ // Default style diff --git a/lib/lvgl/src/extra/others/monkey/lv_monkey.c b/lib/lvgl/src/extra/others/monkey/lv_monkey.c old mode 100755 new mode 100644 diff --git a/lib/lvgl/src/extra/others/monkey/lv_monkey.h b/lib/lvgl/src/extra/others/monkey/lv_monkey.h old mode 100755 new mode 100644 diff --git a/lib/lvgl/src/extra/others/msg/lv_msg.c b/lib/lvgl/src/extra/others/msg/lv_msg.c index 8fd434d..d54279c 100644 --- a/lib/lvgl/src/extra/others/msg/lv_msg.c +++ b/lib/lvgl/src/extra/others/msg/lv_msg.c @@ -94,6 +94,25 @@ void lv_msg_unsubscribe(void * s) lv_mem_free(s); } +uint32_t lv_msg_unsubscribe_obj(uint32_t msg_id, lv_obj_t * obj) +{ + uint32_t cnt = 0; + sub_dsc_t * s = _lv_ll_get_head(&subs_ll); + while(s) { + sub_dsc_t * s_next = _lv_ll_get_next(&subs_ll, s); + if(s->callback == obj_notify_cb && + (s->msg_id == LV_MSG_ID_ANY || s->msg_id == msg_id) && + (obj == NULL || s->_priv_data == obj)) { + lv_msg_unsubscribe(s); + cnt++; + } + + s = s_next; + } + + return cnt; +} + void lv_msg_send(uint32_t msg_id, const void * payload) { lv_msg_t m; @@ -129,8 +148,6 @@ lv_msg_t * lv_event_get_msg(lv_event_t * e) } } - - /********************** * STATIC FUNCTIONS **********************/ diff --git a/lib/lvgl/src/extra/others/msg/lv_msg.h b/lib/lvgl/src/extra/others/msg/lv_msg.h index 11a55b5..0ac2f77 100644 --- a/lib/lvgl/src/extra/others/msg/lv_msg.h +++ b/lib/lvgl/src/extra/others/msg/lv_msg.h @@ -19,6 +19,8 @@ extern "C" { /********************* * DEFINES *********************/ +#define LV_MSG_ID_ANY UINT32_MAX +LV_EXPORT_CONST_INT(LV_MSG_ID_ANY); /********************** * TYPEDEFS @@ -70,6 +72,14 @@ void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data); */ void lv_msg_unsubscribe(void * s); +/** + * Unsubscribe an object from a message ID + * @param msg_id the message ID to unsubcribe from or `LV_MSG_ID_ANY` for any message ID + * @param obj the object to unsubscribe or NULL for any object + * @return number of unsubscriptions + */ +uint32_t lv_msg_unsubscribe_obj(uint32_t msg_id, lv_obj_t * obj); + /** * Send a message with a given ID and payload * @param msg_id ID of the message to send @@ -105,6 +115,17 @@ void * lv_msg_get_user_data(lv_msg_t * m); */ lv_msg_t * lv_event_get_msg(lv_event_t * e); +/*Fix typo*/ +static inline void * lv_msg_subscribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data) +{ + return lv_msg_subsribe(msg_id, cb, user_data); +} + +static inline void * lv_msg_subscribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data) +{ + return lv_msg_subsribe_obj(msg_id, obj, user_data); +} + /********************** * GLOBAL VARIABLES **********************/ diff --git a/lib/lvgl/src/extra/widgets/animimg/lv_animimg.c b/lib/lvgl/src/extra/widgets/animimg/lv_animimg.c index 135a8a4..072d02e 100644 --- a/lib/lvgl/src/extra/widgets/animimg/lv_animimg.c +++ b/lib/lvgl/src/extra/widgets/animimg/lv_animimg.c @@ -64,7 +64,7 @@ lv_obj_t * lv_animimg_create(lv_obj_t * parent) return obj; } -void lv_animimg_set_src(lv_obj_t * obj, lv_img_dsc_t * dsc[], uint8_t num) +void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], uint8_t num) { LV_ASSERT_OBJ(obj, MY_CLASS); lv_animimg_t * animimg = (lv_animimg_t *)obj; diff --git a/lib/lvgl/src/extra/widgets/animimg/lv_animimg.h b/lib/lvgl/src/extra/widgets/animimg/lv_animimg.h index 6329494..0ba01f2 100644 --- a/lib/lvgl/src/extra/widgets/animimg/lv_animimg.h +++ b/lib/lvgl/src/extra/widgets/animimg/lv_animimg.h @@ -37,7 +37,7 @@ typedef struct { lv_img_t img; lv_anim_t anim; /*picture sequence */ - lv_img_dsc_t ** dsc; + const void ** dsc; int8_t pic_count; } lv_animimg_t; @@ -69,7 +69,7 @@ lv_obj_t * lv_animimg_create(lv_obj_t * parent); * @param dsc pointer to a series images * @param num images' number */ -void lv_animimg_set_src(lv_obj_t * img, lv_img_dsc_t * dsc[], uint8_t num); +void lv_animimg_set_src(lv_obj_t * img, const void * dsc[], uint8_t num); /** * Startup the image animation. diff --git a/lib/lvgl/src/extra/widgets/chart/lv_chart.c b/lib/lvgl/src/extra/widgets/chart/lv_chart.c index da6c18c..eae31bd 100644 --- a/lib/lvgl/src/extra/widgets/chart/lv_chart.c +++ b/lib/lvgl/src/extra/widgets/chart/lv_chart.c @@ -261,10 +261,10 @@ uint16_t lv_chart_get_point_count(const lv_obj_t * obj) uint16_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser) { - LV_UNUSED(obj); LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; - return ser->start_point; + return chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; } void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_point_t * p_out) @@ -292,28 +292,34 @@ void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint1 } else if(chart->type == LV_CHART_TYPE_BAR) { uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); - int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, - LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the column on the ~same X*/ - int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, - LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/ - lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; - lv_coord_t col_w = block_w / ser_cnt; + /*Gap between the column on the X tick*/ + int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_ITEMS) * chart->zoom_x) >> 8; + + /*Gap between the columns on adjacent X ticks*/ + int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_MAIN) * chart->zoom_x) >> 8; - p_out->x = (int32_t)((int32_t)w * id) / chart->point_cnt; + lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; lv_chart_series_t * ser_i = NULL; + uint32_t ser_idx = 0; _LV_LL_READ_BACK(&chart->series_ll, ser_i) { if(ser_i == ser) break; - p_out->x += col_w; + ser_idx++; } - p_out->x += (col_w - ser_gap) / 2; + p_out->x = (int32_t)((int32_t)(w + block_gap) * id) / chart->point_cnt; + p_out->x += block_w * ser_idx / ser_cnt; + + lv_coord_t col_w = (block_w - (ser_gap * (ser_cnt - 1))) / ser_cnt; + p_out->x += col_w / 2; } lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; p_out->x -= lv_obj_get_scroll_left(obj); + uint32_t start_point = lv_chart_get_x_start_point(obj, ser); + id = ((int32_t)start_point + id) % chart->point_cnt; int32_t temp_y = 0; temp_y = (int32_t)((int32_t)ser->y_points[id] - chart->ymin[ser->y_axis_sec]) * h; temp_y = temp_y / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); @@ -913,7 +919,7 @@ static void draw_series_line(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) line_dsc_default.color = ser->color; point_dsc_default.bg_color = ser->color; - lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser); p1.x = x_ofs; p2.x = x_ofs; @@ -1075,7 +1081,7 @@ static void draw_series_scatter(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) line_dsc_default.color = ser->color; point_dsc_default.bg_color = ser->color; - lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser); p1.x = x_ofs; p2.x = x_ofs; @@ -1182,7 +1188,6 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) const lv_area_t * clip_area_ori = draw_ctx->clip_area; draw_ctx->clip_area = &clip_area; - lv_chart_t * chart = (lv_chart_t *)obj; uint16_t i; @@ -1200,6 +1205,7 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the columns on the ~same X*/ lv_coord_t col_w = (block_w - (ser_cnt - 1) * ser_gap) / ser_cnt; + if(col_w < 1) col_w = 1; lv_coord_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); lv_coord_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w; @@ -1229,7 +1235,8 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) /*Draw the current point of all data line*/ _LV_LL_READ_BACK(&chart->series_ll, ser) { if(ser->hidden) continue; - lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser); col_a.x1 = x_act; col_a.x2 = col_a.x1 + col_w - 1; @@ -1382,8 +1389,10 @@ static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); - if(t->major_cnt <= 1) return; if(!t->label_en && !t->major_len && !t->minor_len) return; + if(t->major_cnt <= 1) return; + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + if(total_tick_num == 0) return; uint8_t sec_axis = axis == LV_CHART_AXIS_PRIMARY_Y ? 0 : 1; @@ -1433,7 +1442,6 @@ static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis part_draw_dsc.line_dsc = &line_dsc; part_draw_dsc.label_dsc = &label_dsc; - uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); for(i = 0; i <= total_tick_num; i++) { /*draw a line at moving y position*/ p2.y = p1.y = y_ofs + (int32_t)((int32_t)(h - line_dsc.width) * i) / total_tick_num; @@ -1514,6 +1522,8 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); if(t->major_cnt <= 1) return; if(!t->label_en && !t->major_len && !t->minor_len) return; + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + if(total_tick_num == 0) return; uint32_t i; lv_point_t p1; @@ -1531,16 +1541,16 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_coord_t label_gap; if(axis == LV_CHART_AXIS_PRIMARY_X) { label_gap = t->label_en ? lv_obj_get_style_pad_bottom(obj, LV_PART_TICKS) : 0; - y_ofs = obj->coords.y2; + y_ofs = obj->coords.y2 + 1; } else { label_gap = t->label_en ? lv_obj_get_style_pad_top(obj, LV_PART_TICKS) : 0; - y_ofs = obj->coords.y1; + y_ofs = obj->coords.y1 - 1; } if(axis == LV_CHART_AXIS_PRIMARY_X) { if(y_ofs > draw_ctx->clip_area->y2) return; - if(y_ofs + label_gap + label_dsc.font->line_height + t->major_len < draw_ctx->clip_area->y1) return; + if(y_ofs + label_gap + label_dsc.font->line_height + t->major_len < draw_ctx->clip_area->y1) return; } lv_draw_line_dsc_t line_dsc; @@ -1571,7 +1581,6 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis } p1.y = y_ofs; - uint32_t total_tick_num = (t->major_cnt - 1) * t->minor_cnt; for(i = 0; i <= total_tick_num; i++) { /*one extra loop - it may not exist in the list, empty label*/ bool major = false; if(i % t->minor_cnt == 0) major = true; @@ -1634,7 +1643,6 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); } - if(p1.x + line_dsc.width / 2 >= obj->coords.x1 && p2.x - line_dsc.width / 2 <= obj->coords.x2) { lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); diff --git a/lib/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c b/lib/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c index 3fb7128..daf112e 100644 --- a/lib/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c +++ b/lib/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c @@ -613,7 +613,6 @@ static lv_res_t double_click_reset(lv_obj_t * obj) * We replace division by 255 by a division by 256, a.k.a a shift right by 8 bits. * This is wrong, but since this is only used to compute the pixels on the screen and not the final color, it's ok. */ -static void fast_hsv2rgb(uint16_t h, uint8_t s, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b); static void fast_hsv2rgb(uint16_t h, uint8_t s, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b) { if(!s) { @@ -652,6 +651,11 @@ static lv_color_t angle_to_mode_color_fast(lv_obj_t * obj, uint16_t angle) uint8_t r = 0, g = 0, b = 0; static uint16_t h = 0; static uint8_t s = 0, v = 0, m = 255; + static uint16_t angle_saved = 0xffff; + + /*If the angle is different recalculate scaling*/ + if(angle_saved != angle) m = 255; + angle_saved = angle; switch(ext->mode) { default: diff --git a/lib/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c b/lib/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c index 00c3011..06c68fb 100644 --- a/lib/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c +++ b/lib/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c @@ -205,6 +205,15 @@ static void lv_imgbtn_event(const lv_obj_class_t * class_p, lv_event_t * e) p->x = LV_MAX(p->x, header.w); } } + /*Sent when the widget is checked due to LV_OBJ_FLAG_CHECKABLE */ + else if(code == LV_EVENT_VALUE_CHANGED) { + if(lv_obj_has_state(obj, LV_STATE_CHECKED)) { + lv_imgbtn_set_state(obj, LV_IMGBTN_STATE_CHECKED_RELEASED); + } + else { + lv_imgbtn_set_state(obj, LV_IMGBTN_STATE_RELEASED); + } + } } static void draw_main(lv_event_t * e) diff --git a/lib/lvgl/src/extra/widgets/keyboard/lv_keyboard.c b/lib/lvgl/src/extra/widgets/keyboard/lv_keyboard.c index 8e052e3..cbb5e1c 100644 --- a/lib/lvgl/src/extra/widgets/keyboard/lv_keyboard.c +++ b/lib/lvgl/src/extra/widgets/keyboard/lv_keyboard.c @@ -73,7 +73,7 @@ static const lv_btnmatrix_ctrl_t default_kb_ctrl_uc_map[] = { }; static const char * const default_kb_map_spec[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", LV_SYMBOL_BACKSPACE, "\n", - "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "abc", "+", "&", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" }; diff --git a/lib/lvgl/src/extra/widgets/menu/lv_menu.c b/lib/lvgl/src/extra/widgets/menu/lv_menu.c index 78577e7..f8dfd41 100644 --- a/lib/lvgl/src/extra/widgets/menu/lv_menu.c +++ b/lib/lvgl/src/extra/widgets/menu/lv_menu.c @@ -195,6 +195,11 @@ void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) lv_menu_t * menu = (lv_menu_t *)obj; + /* Guard against setting the same page again */ + if(menu->main_page == page) { + return; + } + /* Hide previous page */ if(menu->main_page != NULL) { lv_obj_set_parent(menu->main_page, menu->storage); diff --git a/lib/lvgl/src/extra/widgets/meter/lv_meter.c b/lib/lvgl/src/extra/widgets/meter/lv_meter.c index 668ab97..f1ea9d5 100644 --- a/lib/lvgl/src/extra/widgets/meter/lv_meter.c +++ b/lib/lvgl/src/extra/widgets/meter/lv_meter.c @@ -336,7 +336,7 @@ static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t scale_center.x = scale_area->x1 + r_out; scale_center.y = scale_area->y1 + r_out; - lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t opa_main = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); lv_meter_indicator_t * indic; lv_obj_draw_part_dsc_t part_draw_dsc; @@ -360,6 +360,8 @@ static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t int32_t end_angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + arc_dsc.start_angle = start_angle; + arc_dsc.end_angle = end_angle; part_draw_dsc.radius = r_out + indic->type_data.arc.r_mod; part_draw_dsc.sub_part_ptr = indic; part_draw_dsc.p1 = &scale_center; @@ -511,7 +513,8 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); lv_point_t label_size; - lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, + lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc_tmp.font, label_dsc_tmp.letter_space, + label_dsc_tmp.line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); lv_area_t label_cord; @@ -563,12 +566,13 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area lv_draw_img_dsc_t img_dsc; lv_draw_img_dsc_init(&img_dsc); lv_obj_init_draw_img_dsc(obj, LV_PART_ITEMS, &img_dsc); - lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t opa_main = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); lv_obj_draw_part_dsc_t part_draw_dsc; lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); part_draw_dsc.class_p = MY_CLASS; part_draw_dsc.p1 = &scale_center; + part_draw_dsc.part = LV_PART_INDICATOR; lv_meter_indicator_t * indic; _LV_LL_READ_BACK(&meter->indicator_ll, indic) { @@ -585,12 +589,12 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area line_dsc.width = indic->type_data.needle_line.width; line_dsc.opa = indic->opa > LV_OPA_MAX ? opa_main : (opa_main * indic->opa) >> 8; - part_draw_dsc.id = LV_METER_DRAW_PART_NEEDLE_LINE; + part_draw_dsc.type = LV_METER_DRAW_PART_NEEDLE_LINE; part_draw_dsc.line_dsc = &line_dsc; part_draw_dsc.p2 = &p_end; - + part_draw_dsc.p1 = &scale_center; lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); - lv_draw_line(draw_ctx, &line_dsc, &scale_center, &p_end); + lv_draw_line(draw_ctx, &line_dsc, part_draw_dsc.p1, &p_end); lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); } else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG) { @@ -612,6 +616,7 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area if(angle > 3600) angle -= 3600; img_dsc.angle = angle; + part_draw_dsc.type = LV_METER_DRAW_PART_NEEDLE_IMG; part_draw_dsc.img_dsc = &img_dsc; lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); diff --git a/lib/lvgl/src/extra/widgets/meter/lv_meter.h b/lib/lvgl/src/extra/widgets/meter/lv_meter.h index 24c1dae..330bc2a 100644 --- a/lib/lvgl/src/extra/widgets/meter/lv_meter.h +++ b/lib/lvgl/src/extra/widgets/meter/lv_meter.h @@ -42,7 +42,6 @@ typedef struct { uint16_t tick_major_width; int16_t label_gap; - int16_t label_color; int32_t min; int32_t max; diff --git a/lib/lvgl/src/extra/widgets/msgbox/lv_msgbox.c b/lib/lvgl/src/extra/widgets/msgbox/lv_msgbox.c index 8db5df7..54d65e3 100644 --- a/lib/lvgl/src/extra/widgets/msgbox/lv_msgbox.c +++ b/lib/lvgl/src/extra/widgets/msgbox/lv_msgbox.c @@ -106,6 +106,9 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * } mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); + LV_ASSERT_MALLOC(mbox->content); + if(mbox->content == NULL) return NULL; + lv_obj_class_init_obj(mbox->content); bool has_txt = txt && strlen(txt) > 0; if(has_txt) { diff --git a/lib/lvgl/src/extra/widgets/span/lv_span.c b/lib/lvgl/src/extra/widgets/span/lv_span.c index 96f0447..6f970c5 100644 --- a/lib/lvgl/src/extra/widgets/span/lv_span.c +++ b/lib/lvgl/src/extra/widgets/span/lv_span.c @@ -779,7 +779,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) lv_coord_t max_width = lv_area_get_width(&coords); lv_coord_t indent = convert_indent_pct(obj, max_width); lv_coord_t max_w = max_width - indent; /* first line need minus indent */ - lv_opa_t obj_opa = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t obj_opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); /* coords of draw span-txt */ lv_point_t txt_pos; diff --git a/lib/lvgl/src/extra/widgets/spinbox/lv_spinbox.c b/lib/lvgl/src/extra/widgets/spinbox/lv_spinbox.c index 3469105..37db45c 100644 --- a/lib/lvgl/src/extra/widgets/spinbox/lv_spinbox.c +++ b/lib/lvgl/src/extra/widgets/spinbox/lv_spinbox.c @@ -434,9 +434,6 @@ static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) else if(c == LV_KEY_DOWN) { lv_spinbox_decrement(obj); } - else { - lv_textarea_add_char(obj, c); - } } } diff --git a/lib/lvgl/src/extra/widgets/tabview/lv_tabview.c b/lib/lvgl/src/extra/widgets/tabview/lv_tabview.c index 81addc6..f013823 100755 --- a/lib/lvgl/src/extra/widgets/tabview/lv_tabview.c +++ b/lib/lvgl/src/extra/widgets/tabview/lv_tabview.c @@ -77,8 +77,8 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name) lv_obj_t * btns = lv_tabview_get_tab_btns(obj); - char ** old_map = tabview->map; - char ** new_map; + const char ** old_map = (const char **)tabview->map; + const char ** new_map; /*top or bottom dir*/ if(tabview->tab_pos & LV_DIR_VER) { @@ -129,15 +129,17 @@ void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t id, const char * new_name) if(id >= tabview->tab_cnt) return; if(tabview->tab_pos & LV_DIR_HOR) id *= 2; - lv_mem_free(tabview->map[id]); + lv_mem_free((void *)tabview->map[id]); tabview->map[id] = lv_mem_alloc(strlen(new_name) + 1); - strcpy(tabview->map[id], new_name); + strcpy((void *)tabview->map[id], new_name); lv_obj_invalidate(obj); } void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en) { LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->being_deleted) return; + lv_tabview_t * tabview = (lv_tabview_t *)obj; if(id >= tabview->tab_cnt) { @@ -271,13 +273,13 @@ static void lv_tabview_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj uint32_t i; if(tabview->tab_pos & LV_DIR_VER) { for(i = 0; i < tabview->tab_cnt; i++) { - lv_mem_free(tabview->map[i]); + lv_mem_free((void *)tabview->map[i]); tabview->map[i] = NULL; } } if(tabview->tab_pos & LV_DIR_HOR) { for(i = 0; i < tabview->tab_cnt; i++) { - lv_mem_free(tabview->map[i * 2]); + lv_mem_free((void *)tabview->map[i * 2]); tabview->map[i * 2] = NULL; } } @@ -308,7 +310,7 @@ static void btns_value_changed_event_cb(lv_event_t * e) lv_obj_t * tv = lv_obj_get_parent(btns); uint32_t id = lv_btnmatrix_get_selected_btn(btns); - lv_tabview_set_act(tv, id, LV_ANIM_ON); + lv_tabview_set_act(tv, id, LV_ANIM_OFF); } static void cont_scroll_end_event_cb(lv_event_t * e) diff --git a/lib/lvgl/src/extra/widgets/tabview/lv_tabview.h b/lib/lvgl/src/extra/widgets/tabview/lv_tabview.h index 388c654..ee7d7ce 100644 --- a/lib/lvgl/src/extra/widgets/tabview/lv_tabview.h +++ b/lib/lvgl/src/extra/widgets/tabview/lv_tabview.h @@ -27,7 +27,7 @@ extern "C" { typedef struct { lv_obj_t obj; - char ** map; + const char ** map; uint16_t tab_cnt; uint16_t tab_cur; lv_dir_t tab_pos; diff --git a/lib/lvgl/src/font/lv_font_fmt_txt.c b/lib/lvgl/src/font/lv_font_fmt_txt.c index 7a36f01..78beaff 100644 --- a/lib/lvgl/src/font/lv_font_fmt_txt.c +++ b/lib/lvgl/src/font/lv_font_fmt_txt.c @@ -148,10 +148,10 @@ const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unic bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { - bool is_tab = false; - if(unicode_letter == '\t') { + /*It fixes a strange compiler optimization issue: https://github.com/lvgl/lvgl/issues/4370*/ + bool is_tab = unicode_letter == '\t'; + if(is_tab) { unicode_letter = ' '; - is_tab = true; } lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; uint32_t gid = get_glyph_dsc_id(font, unicode_letter); diff --git a/lib/lvgl/src/hal/lv_hal_disp.c b/lib/lvgl/src/hal/lv_hal_disp.c index 0dd8f6b..6f1c962 100644 --- a/lib/lvgl/src/hal/lv_hal_disp.c +++ b/lib/lvgl/src/hal/lv_hal_disp.c @@ -23,9 +23,9 @@ #include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" #include "../draw/arm2d/lv_gpu_arm2d.h" -#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE - #include "../draw/nxp/lv_gpu_nxp.h" -#endif +#include "../draw/nxp/vglite/lv_draw_vglite.h" +#include "../draw/nxp/pxp/lv_draw_pxp.h" +#include "../draw/renesas/lv_gpu_d2_ra6m3.h" #if LV_USE_THEME_DEFAULT #include "../extra/themes/default/lv_theme_default.h" @@ -96,8 +96,11 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) driver->dpi = LV_DPI_DEF; driver->color_chroma_key = LV_COLOR_CHROMA_KEY; - -#if LV_USE_GPU_STM32_DMA2D +#if LV_USE_GPU_RA6M3_G2D + driver->draw_ctx_init = lv_draw_ra6m3_2d_ctx_init; + driver->draw_ctx_deinit = lv_draw_ra6m3_2d_ctx_init; + driver->draw_ctx_size = sizeof(lv_draw_ra6m3_dma2d_ctx_t); +#elif LV_USE_GPU_STM32_DMA2D driver->draw_ctx_init = lv_draw_stm32_dma2d_ctx_init; driver->draw_ctx_deinit = lv_draw_stm32_dma2d_ctx_init; driver->draw_ctx_size = sizeof(lv_draw_stm32_dma2d_ctx_t); @@ -105,10 +108,14 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) driver->draw_ctx_init = lv_draw_swm341_dma2d_ctx_init; driver->draw_ctx_deinit = lv_draw_swm341_dma2d_ctx_init; driver->draw_ctx_size = sizeof(lv_draw_swm341_dma2d_ctx_t); -#elif LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE - driver->draw_ctx_init = lv_draw_nxp_ctx_init; - driver->draw_ctx_deinit = lv_draw_nxp_ctx_deinit; - driver->draw_ctx_size = sizeof(lv_draw_nxp_ctx_t); +#elif LV_USE_GPU_NXP_VG_LITE + driver->draw_ctx_init = lv_draw_vglite_ctx_init; + driver->draw_ctx_deinit = lv_draw_vglite_ctx_deinit; + driver->draw_ctx_size = sizeof(lv_draw_vglite_ctx_t); +#elif LV_USE_GPU_NXP_PXP + driver->draw_ctx_init = lv_draw_pxp_ctx_init; + driver->draw_ctx_deinit = lv_draw_pxp_ctx_deinit; + driver->draw_ctx_size = sizeof(lv_draw_pxp_ctx_t); #elif LV_USE_GPU_SDL driver->draw_ctx_init = lv_draw_sdl_init_ctx; driver->draw_ctx_deinit = lv_draw_sdl_deinit_ctx; @@ -179,6 +186,8 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp->inv_en_cnt = 1; + _lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); + lv_disp_t * disp_def_tmp = disp_def; disp_def = disp; /*Temporarily change the default screen to create the default screens on the new display*/ @@ -309,6 +318,7 @@ void lv_disp_remove(lv_disp_t * disp) } _lv_ll_remove(&LV_GC_ROOT(_lv_disp_ll), disp); + _lv_ll_clear(&disp->sync_areas); if(disp->refr_timer) lv_timer_del(disp->refr_timer); lv_mem_free(disp); @@ -506,7 +516,7 @@ lv_coord_t lv_disp_get_dpi(const lv_disp_t * disp) * Call in the display driver's `flush_cb` function when the flushing is finished * @param disp_drv pointer to display driver in `flush_cb` where this function is called */ -LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) +void LV_ATTRIBUTE_FLUSH_READY lv_disp_flush_ready(lv_disp_drv_t * disp_drv) { disp_drv->draw_buf->flushing = 0; disp_drv->draw_buf->flushing_last = 0; @@ -518,7 +528,7 @@ LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) * @param disp_drv pointer to display driver * @return true: it's the last area to flush; false: there are other areas too which will be refreshed soon */ -LV_ATTRIBUTE_FLUSH_READY bool lv_disp_flush_is_last(lv_disp_drv_t * disp_drv) +bool LV_ATTRIBUTE_FLUSH_READY lv_disp_flush_is_last(lv_disp_drv_t * disp_drv) { return disp_drv->draw_buf->flushing_last; } diff --git a/lib/lvgl/src/hal/lv_hal_disp.h b/lib/lvgl/src/hal/lv_hal_disp.h index d3425fe..d5203a0 100644 --- a/lib/lvgl/src/hal/lv_hal_disp.h +++ b/lib/lvgl/src/hal/lv_hal_disp.h @@ -23,6 +23,7 @@ extern "C" { #include "../misc/lv_area.h" #include "../misc/lv_ll.h" #include "../misc/lv_timer.h" +#include "../misc/lv_ll.h" /********************* * DEFINES @@ -173,10 +174,8 @@ typedef struct _lv_disp_t { struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top*/ struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys*/ uint32_t screen_cnt; -uint8_t draw_prev_over_act : - 1; /**< 1: Draw previous screen over active screen*/ -uint8_t del_prev : - 1; /**< 1: Automatically delete the previous screen when the screen load animation is ready*/ + uint8_t draw_prev_over_act : 1; /**< 1: Draw previous screen over active screen*/ + uint8_t del_prev : 1; /**< 1: Automatically delete the previous screen when the screen load anim. is ready*/ uint8_t rendering_in_progress : 1; /**< 1: The current screen rendering is in progress*/ lv_opa_t bg_opa; /**0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + /*PNG decoder library*/ #ifndef LV_USE_PNG #ifdef CONFIG_LV_USE_PNG @@ -2169,6 +2217,25 @@ #endif #endif +/*Tiny TTF library*/ +#ifndef LV_USE_TINY_TTF + #ifdef CONFIG_LV_USE_TINY_TTF + #define LV_USE_TINY_TTF CONFIG_LV_USE_TINY_TTF + #else + #define LV_USE_TINY_TTF 0 + #endif +#endif +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #ifndef LV_TINY_TTF_FILE_SUPPORT + #ifdef CONFIG_LV_TINY_TTF_FILE_SUPPORT + #define LV_TINY_TTF_FILE_SUPPORT CONFIG_LV_TINY_TTF_FILE_SUPPORT + #else + #define LV_TINY_TTF_FILE_SUPPORT 0 + #endif + #endif +#endif + /*Rlottie library*/ #ifndef LV_USE_RLOTTIE #ifdef CONFIG_LV_USE_RLOTTIE diff --git a/lib/lvgl/src/lv_conf_kconfig.h b/lib/lvgl/src/lv_conf_kconfig.h index 7742fe7..80f7061 100644 --- a/lib/lvgl/src/lv_conf_kconfig.h +++ b/lib/lvgl/src/lv_conf_kconfig.h @@ -47,7 +47,7 @@ extern "C" { #ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT # define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT -#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID) +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_MID) # define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID #elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT) # define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT @@ -67,7 +67,7 @@ extern "C" { #ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT # define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT -#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID) +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_MID) # define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID #elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT) # define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT diff --git a/lib/lvgl/src/misc/lv_area.c b/lib/lvgl/src/misc/lv_area.c index c0221f7..493b708 100644 --- a/lib/lvgl/src/misc/lv_area.c +++ b/lib/lvgl/src/misc/lv_area.c @@ -143,6 +143,78 @@ bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area return union_ok; } +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results or -1 if no intersect + */ +int8_t _lv_area_diff(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Areas have no common parts*/ + if(!_lv_area_is_on(a1_p, a2_p)) return -1; + + /*No remaining areas after removing common parts*/ + if(_lv_area_is_in(a1_p, a2_p, 0)) return 0; + + /*Result counter*/ + int8_t res_c = 0; + + /*Get required information*/ + lv_area_t n; + lv_coord_t a1_w = lv_area_get_width(a1_p) - 1; + lv_coord_t a1_h = lv_area_get_height(a1_p) - 1; + + /*Compute top rectangle*/ + lv_coord_t th = a2_p->y1 - a1_p->y1; + if(th > 0) { + n.x1 = a1_p->x1; + n.y1 = a1_p->y1; + n.x2 = a1_p->x2; + n.y2 = a1_p->y1 + th; + res_p[res_c++] = n; + } + + /*Compute the bottom rectangle*/ + lv_coord_t bh = a1_h - (a2_p->y2 - a1_p->y1); + if(bh > 0 && a2_p->y2 < a1_p->y2) { + n.x1 = a1_p->x1; + n.y1 = a2_p->y2; + n.x2 = a1_p->x2; + n.y2 = a2_p->y2 + bh; + res_p[res_c++] = n; + } + + /*Compute side height*/ + lv_coord_t y1 = a2_p->y1 > a1_p->y1 ? a2_p->y1 : a1_p->y1; + lv_coord_t y2 = a2_p->y2 < a1_p->y2 ? a2_p->y2 : a1_p->y2; + lv_coord_t sh = y2 - y1; + + /*Compute the left rectangle*/ + lv_coord_t lw = a2_p->x1 - a1_p->x1; + if(lw > 0 && sh > 0) { + n.x1 = a1_p->x1; + n.y1 = y1; + n.x2 = a1_p->x1 + lw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + /*Compute the right rectangle*/ + lv_coord_t rw = a1_w - (a2_p->x2 - a1_p->x1); + if(rw > 0) { + n.x1 = a2_p->x2; + n.y1 = y1; + n.x2 = a2_p->x2 + rw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + //Return number of results + return res_c; +} + /** * Join two areas into a third which involves the other two * @param res_p pointer to an area, the result will be stored here diff --git a/lib/lvgl/src/misc/lv_area.h b/lib/lvgl/src/misc/lv_area.h index 137931a..48dc807 100644 --- a/lib/lvgl/src/misc/lv_area.h +++ b/lib/lvgl/src/misc/lv_area.h @@ -177,6 +177,15 @@ void lv_area_move(lv_area_t * area, lv_coord_t x_ofs, lv_coord_t y_ofs); */ bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results (max 4) or -1 if no intersect + */ +int8_t _lv_area_diff(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + /** * Join two areas into a third which involves the other two * @param res_p pointer to an area, the result will be stored here diff --git a/lib/lvgl/src/misc/lv_bidi.c b/lib/lvgl/src/misc/lv_bidi.c index 3dc3ce7..70af1c4 100644 --- a/lib/lvgl/src/misc/lv_bidi.c +++ b/lib/lvgl/src/misc/lv_bidi.c @@ -376,7 +376,6 @@ static bool lv_bidi_letter_is_weak(uint32_t letter) */ static bool lv_bidi_letter_is_rtl(uint32_t letter) { - if(letter >= 0x5d0 && letter <= 0x5ea) return true; if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ @@ -384,6 +383,10 @@ static bool lv_bidi_letter_is_rtl(uint32_t letter) if(letter >= 0xFB50 && letter <= 0xFDFF) return true; if(letter >= 0xFE70 && letter <= 0xFEFF) return true; + /*Check for Hebrew characters [https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet]*/ + if(letter >= 0x590 && letter <= 0x5FF) return true; + if(letter >= 0xFB1D && letter <= 0xFB4F) return true; + return false; } diff --git a/lib/lvgl/src/misc/lv_color.c b/lib/lvgl/src/misc/lv_color.c index 0e26624..9ad5a14 100644 --- a/lib/lvgl/src/misc/lv_color.c +++ b/lib/lvgl/src/misc/lv_color.c @@ -33,7 +33,7 @@ * GLOBAL FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num) +void LV_ATTRIBUTE_FAST_MEM lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num) { #if LV_COLOR_DEPTH == 16 uintptr_t buf_int = (uintptr_t)buf; diff --git a/lib/lvgl/src/misc/lv_color.h b/lib/lvgl/src/misc/lv_color.h index 2cc92f2..61b5013 100644 --- a/lib/lvgl/src/misc/lv_color.h +++ b/lib/lvgl/src/misc/lv_color.h @@ -436,11 +436,15 @@ static inline uint32_t lv_color_to32(lv_color_t color) * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` * @return the mixed color */ -LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) +static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) { lv_color_t ret; -#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 && LV_COLOR_MIX_ROUND_OFS == 0 +#if LV_COLOR_DEPTH == 16 && LV_COLOR_MIX_ROUND_OFS == 0 +#if LV_COLOR_16_SWAP == 1 + c1.full = c1.full << 8 | c1.full >> 8; + c2.full = c2.full << 8 | c2.full >> 8; +#endif /*Source: https://stackoverflow.com/a/50012418/1999969*/ mix = (uint32_t)((uint32_t)mix + 4) >> 3; uint32_t bg = (uint32_t)((uint32_t)c2.full | ((uint32_t)c2.full << 16)) & @@ -448,6 +452,9 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co uint32_t fg = (uint32_t)((uint32_t)c1.full | ((uint32_t)c1.full << 16)) & 0x7E0F81F; uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; ret.full = (uint16_t)((result >> 16) | result); +#if LV_COLOR_16_SWAP == 1 + ret.full = ret.full << 8 | ret.full >> 8; +#endif #elif LV_COLOR_DEPTH != 1 /*LV_COLOR_DEPTH == 8, 16 or 32*/ LV_COLOR_SET_R(ret, LV_UDIV255((uint16_t)LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) * @@ -465,7 +472,7 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co return ret; } -LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out) +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out) { #if LV_COLOR_DEPTH != 1 out[0] = (uint16_t)LV_COLOR_GET_R(c) * mix; @@ -490,7 +497,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t * @return the mixed color * @note 255 won't give clearly `c1`. */ -LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix) +static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix) { lv_color_t ret; #if LV_COLOR_DEPTH != 1 @@ -521,7 +528,7 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * p * @param res_color the result color * @param res_opa the result opacity */ -LV_ATTRIBUTE_FAST_MEM static inline void lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa, +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa, lv_color_t fg_color, lv_opa_t fg_opa, lv_color_t * res_color, lv_opa_t * res_opa) { @@ -637,7 +644,7 @@ static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_colo //! @cond Doxygen_Suppress //! -LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num); //! @endcond lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl); diff --git a/lib/lvgl/src/misc/lv_fs.h b/lib/lvgl/src/misc/lv_fs.h index 9f65e1b..c941402 100644 --- a/lib/lvgl/src/misc/lv_fs.h +++ b/lib/lvgl/src/misc/lv_fs.h @@ -57,7 +57,6 @@ enum { }; typedef uint8_t lv_fs_mode_t; - /** * Seek modes. */ diff --git a/lib/lvgl/src/misc/lv_math.c b/lib/lvgl/src/misc/lv_math.c index bfb3934..cf2d0fb 100644 --- a/lib/lvgl/src/misc/lv_math.c +++ b/lib/lvgl/src/misc/lv_math.c @@ -45,7 +45,7 @@ static const int16_t sin0_90_table[] = { * @param angle * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 */ -LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle) +int16_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle) { int16_t ret = 0; angle = angle % 360; @@ -106,7 +106,7 @@ uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t * If root < 256: mask = 0x800 * Else: mask = 0x8000 */ -LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) +void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) { x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/ diff --git a/lib/lvgl/src/misc/lv_math.h b/lib/lvgl/src/misc/lv_math.h index 4b2860a..771b4aa 100644 --- a/lib/lvgl/src/misc/lv_math.h +++ b/lib/lvgl/src/misc/lv_math.h @@ -44,9 +44,9 @@ typedef struct { * @param angle * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 */ -LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle); +int16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle); -static inline LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_cos(int16_t angle) +static inline int16_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) { return lv_trigo_sin(angle + 90); } @@ -84,7 +84,7 @@ uint16_t lv_atan2(int x, int y); * If root < 256: mask = 0x800 * Else: mask = 0x8000 */ -LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); //! @endcond diff --git a/lib/lvgl/src/misc/lv_mem.c b/lib/lvgl/src/misc/lv_mem.c index b7c602f..25f24c9 100644 --- a/lib/lvgl/src/misc/lv_mem.c +++ b/lib/lvgl/src/misc/lv_mem.c @@ -365,7 +365,7 @@ void lv_mem_buf_free_all(void) * @param src pointer to the source buffer * @param len number of byte to copy */ -LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) { uint8_t * d8 = dst; const uint8_t * s8 = src; @@ -427,7 +427,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) * @param v value to set [0..255] * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len) +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) { uint8_t * d8 = (uint8_t *)dst; @@ -470,7 +470,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len) * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len) +void LV_ATTRIBUTE_FAST_MEM lv_memset_00(void * dst, size_t len) { uint8_t * d8 = (uint8_t *)dst; uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; @@ -508,7 +508,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len) * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len) +void LV_ATTRIBUTE_FAST_MEM lv_memset_ff(void * dst, size_t len) { uint8_t * d8 = (uint8_t *)dst; uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; diff --git a/lib/lvgl/src/misc/lv_mem.h b/lib/lvgl/src/misc/lv_mem.h index 7a83b3d..9be9425 100644 --- a/lib/lvgl/src/misc/lv_mem.h +++ b/lib/lvgl/src/misc/lv_mem.h @@ -183,7 +183,7 @@ static inline void lv_memset_ff(void * dst, size_t len) * @param src pointer to the source buffer * @param len number of byte to copy */ -LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len); +void * /* LV_ATTRIBUTE_FAST_MEM */ lv_memcpy(void * dst, const void * src, size_t len); /** * Same as `memcpy` but optimized to copy only a few bytes. @@ -191,7 +191,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) * @param src pointer to the source buffer * @param len number of byte to copy */ -LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const void * src, size_t len) +static inline void * LV_ATTRIBUTE_FAST_MEM lv_memcpy_small(void * dst, const void * src, size_t len) { uint8_t * d8 = (uint8_t *)dst; const uint8_t * s8 = (const uint8_t *)src; @@ -212,21 +212,21 @@ LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const voi * @param v value to set [0..255] * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset(void * dst, uint8_t v, size_t len); /** * Same as `memset(dst, 0x00, len)` but optimized for 4 byte operation. * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset_00(void * dst, size_t len); /** * Same as `memset(dst, 0xFF, len)` but optimized for 4 byte operation. * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset_ff(void * dst, size_t len); //! @endcond diff --git a/lib/lvgl/src/misc/lv_printf.h b/lib/lvgl/src/misc/lv_printf.h index 4cbbd84..09563db 100644 --- a/lib/lvgl/src/misc/lv_printf.h +++ b/lib/lvgl/src/misc/lv_printf.h @@ -40,14 +40,20 @@ /* platform-specific printf format for int32_t, usually "d" or "ld" */ #define LV_PRId32 PRId32 #define LV_PRIu32 PRIu32 + #define LV_PRIx32 PRIx32 + #define LV_PRIX32 PRIX32 #else #define LV_PRId32 "d" #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" #endif #else /* hope this is correct for ports without __has_include or without inttypes.h */ #define LV_PRId32 "d" #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" #endif #ifdef __cplusplus diff --git a/lib/lvgl/src/misc/lv_style.c b/lib/lvgl/src/misc/lv_style.c index 419c29e..994be81 100644 --- a/lib/lvgl/src/misc/lv_style.c +++ b/lib/lvgl/src/misc/lv_style.c @@ -119,7 +119,8 @@ const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PR [LV_STYLE_RADIUS] = 0, [LV_STYLE_CLIP_CORNER] = 0, - [LV_STYLE_OPA] = LV_STYLE_PROP_LAYER_REFR, + [LV_STYLE_OPA] = 0, + [LV_STYLE_OPA_LAYERED] = LV_STYLE_PROP_LAYER_REFR, [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_INHERIT, [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_INHERIT, [LV_STYLE_ANIM_TIME] = 0, @@ -330,6 +331,7 @@ lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) value.color = lv_color_black(); break; case LV_STYLE_OPA: + case LV_STYLE_OPA_LAYERED: case LV_STYLE_BORDER_OPA: case LV_STYLE_TEXT_OPA: case LV_STYLE_IMG_OPA: diff --git a/lib/lvgl/src/misc/lv_style.h b/lib/lvgl/src/misc/lv_style.h index 770ba1d..77bf283 100644 --- a/lib/lvgl/src/misc/lv_style.h +++ b/lib/lvgl/src/misc/lv_style.h @@ -49,16 +49,26 @@ extern "C" { #define LV_IMG_ZOOM_NONE 256 /*Value for not zooming the image*/ LV_EXPORT_CONST_INT(LV_IMG_ZOOM_NONE); +// *INDENT-OFF* #if LV_USE_ASSERT_STYLE -#define LV_STYLE_CONST_INIT(var_name, prop_array) const lv_style_t var_name = { .sentinel = LV_STYLE_SENTINEL_VALUE, .v_p = { .const_props = prop_array }, .has_group = 0xFF, .prop1 = LV_STYLE_PROP_ANY } +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .sentinel = LV_STYLE_SENTINEL_VALUE, \ + .v_p = { .const_props = prop_array }, \ + .has_group = 0xFF, \ + .prop1 = LV_STYLE_PROP_ANY, \ + .prop_cnt = (sizeof(prop_array) / sizeof((prop_array)[0])), \ + } #else -#define LV_STYLE_CONST_INIT(var_name, prop_array) const lv_style_t var_name = { .v_p = { .const_props = prop_array }, .has_group = 0xFF, .prop1 = LV_STYLE_PROP_ANY } -#endif - -/** On simple system, don't waste resources on gradients */ -#if !defined(LV_DRAW_COMPLEX) || !defined(LV_GRADIENT_MAX_STOPS) -#define LV_GRADIENT_MAX_STOPS 2 +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .v_p = { .const_props = prop_array }, \ + .has_group = 0xFF, \ + .prop1 = LV_STYLE_PROP_ANY, \ + .prop_cnt = (sizeof(prop_array) / sizeof((prop_array)[0])), \ + } #endif +// *INDENT-ON* #define LV_STYLE_PROP_META_INHERIT 0x8000 #define LV_STYLE_PROP_META_INITIAL 0x4000 @@ -250,23 +260,24 @@ typedef enum { /*Group 6*/ LV_STYLE_OPA = 96, - LV_STYLE_COLOR_FILTER_DSC = 97, - LV_STYLE_COLOR_FILTER_OPA = 98, - LV_STYLE_ANIM = 99, - LV_STYLE_ANIM_TIME = 100, - LV_STYLE_ANIM_SPEED = 101, - LV_STYLE_TRANSITION = 102, - LV_STYLE_BLEND_MODE = 103, - LV_STYLE_TRANSFORM_WIDTH = 104, - LV_STYLE_TRANSFORM_HEIGHT = 105, - LV_STYLE_TRANSLATE_X = 106, - LV_STYLE_TRANSLATE_Y = 107, - LV_STYLE_TRANSFORM_ZOOM = 108, - LV_STYLE_TRANSFORM_ANGLE = 109, - LV_STYLE_TRANSFORM_PIVOT_X = 110, - LV_STYLE_TRANSFORM_PIVOT_Y = 111, - - _LV_STYLE_LAST_BUILT_IN_PROP = 111, + LV_STYLE_OPA_LAYERED = 97, + LV_STYLE_COLOR_FILTER_DSC = 98, + LV_STYLE_COLOR_FILTER_OPA = 99, + LV_STYLE_ANIM = 100, + LV_STYLE_ANIM_TIME = 101, + LV_STYLE_ANIM_SPEED = 102, + LV_STYLE_TRANSITION = 103, + LV_STYLE_BLEND_MODE = 104, + LV_STYLE_TRANSFORM_WIDTH = 105, + LV_STYLE_TRANSFORM_HEIGHT = 106, + LV_STYLE_TRANSLATE_X = 107, + LV_STYLE_TRANSLATE_Y = 108, + LV_STYLE_TRANSFORM_ZOOM = 109, + LV_STYLE_TRANSFORM_ANGLE = 110, + LV_STYLE_TRANSFORM_PIVOT_X = 111, + LV_STYLE_TRANSFORM_PIVOT_Y = 112, + + _LV_STYLE_LAST_BUILT_IN_PROP = 112, _LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1, LV_STYLE_PROP_ANY = 0xFFFF, @@ -440,7 +451,9 @@ static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, { if(style->prop1 == LV_STYLE_PROP_ANY) { const lv_style_const_prop_t * const_prop; - for(const_prop = style->v_p.const_props; const_prop->prop != LV_STYLE_PROP_INV; const_prop++) { + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + const_prop = style->v_p.const_props + i; lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(const_prop->prop); if(prop_id == prop) { if(const_prop->prop & LV_STYLE_PROP_META_INHERIT) diff --git a/lib/lvgl/src/misc/lv_style_gen.c b/lib/lvgl/src/misc/lv_style_gen.c index 13d8560..0b8479d 100644 --- a/lib/lvgl/src/misc/lv_style_gen.c +++ b/lib/lvgl/src/misc/lv_style_gen.c @@ -600,6 +600,14 @@ void lv_style_set_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_OPA, v); } +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA_LAYERED, v); +} + void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) { lv_style_value_t v = { diff --git a/lib/lvgl/src/misc/lv_style_gen.h b/lib/lvgl/src/misc/lv_style_gen.h index 8bf3b68..66ba068 100644 --- a/lib/lvgl/src/misc/lv_style_gen.h +++ b/lib/lvgl/src/misc/lv_style_gen.h @@ -73,6 +73,7 @@ void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); void lv_style_set_radius(lv_style_t * style, lv_coord_t value); void lv_style_set_clip_corner(lv_style_t * style, bool value); void lv_style_set_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value); void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); @@ -458,6 +459,11 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); .prop = LV_STYLE_OPA, .value = { .num = (int32_t)val } \ } +#define LV_STYLE_CONST_OPA_LAYERED(val) \ + { \ + .prop = LV_STYLE_OPA_LAYERED, .value = { .num = (int32_t)val } \ + } + #define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ { \ .prop = LV_STYLE_COLOR_FILTER_DSC, .value = { .ptr = val } \ diff --git a/lib/lvgl/src/misc/lv_timer.c b/lib/lvgl/src/misc/lv_timer.c index d8dd55b..a21038a 100644 --- a/lib/lvgl/src/misc/lv_timer.c +++ b/lib/lvgl/src/misc/lv_timer.c @@ -64,7 +64,7 @@ void _lv_timer_core_init(void) * Call it periodically to handle lv_timers. * @return the time after which it must be called again */ -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) +uint32_t LV_ATTRIBUTE_TIMER_HANDLER lv_timer_handler(void) { TIMER_TRACE("begin"); diff --git a/lib/lvgl/src/misc/lv_timer.h b/lib/lvgl/src/misc/lv_timer.h index a9a8e50..50da8c9 100644 --- a/lib/lvgl/src/misc/lv_timer.h +++ b/lib/lvgl/src/misc/lv_timer.h @@ -65,7 +65,7 @@ void _lv_timer_core_init(void); * Call it periodically to handle lv_timers. * @return time till it needs to be run next (in ms) */ -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); +uint32_t /* LV_ATTRIBUTE_TIMER_HANDLER */ lv_timer_handler(void); //! @endcond @@ -75,7 +75,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); * This function is used to simplify the porting. * @param __ms the period for running lv_timer_handler() */ -static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t ms) +static inline uint32_t LV_ATTRIBUTE_TIMER_HANDLER lv_timer_handler_run_in_period(uint32_t ms) { static uint32_t last_tick = 0; uint32_t curr_tick = lv_tick_get(); diff --git a/lib/lvgl/src/widgets/lv_arc.c b/lib/lvgl/src/widgets/lv_arc.c index 6cab5f3..63cf577 100644 --- a/lib/lvgl/src/widgets/lv_arc.c +++ b/lib/lvgl/src/widgets/lv_arc.c @@ -21,6 +21,10 @@ #define MY_CLASS &lv_arc_class #define VALUE_UNSET INT16_MIN +#define CLICK_OUTSIDE_BG_ANGLES ((uint32_t) 0x00U) +#define CLICK_INSIDE_BG_ANGLES ((uint32_t) 0x01U) +#define CLICK_CLOSER_TO_MAX_END ((uint32_t) 0x00U) +#define CLICK_CLOSER_TO_MIN_END ((uint32_t) 0x01U) /********************** * TYPEDEFS @@ -39,6 +43,8 @@ static void get_center(const lv_obj_t * obj, lv_point_t * center, lv_coord_t * a static lv_coord_t get_angle(const lv_obj_t * obj); static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area); static void value_update(lv_obj_t * arc); +static lv_coord_t knob_get_extra_size(lv_obj_t * obj); +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const uint32_t angle, const uint32_t tolerance_deg); /********************** * STATIC VARIABLES @@ -398,6 +404,7 @@ static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) arc->chg_rate = 720; arc->last_tick = lv_tick_get(); arc->last_angle = arc->indic_angle_end; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); @@ -477,29 +484,54 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) angle -= arc->rotation; angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ + /* If we click near the bg_angle_start the angle will be close to 360° instead of an small angle */ if(angle < 0) angle += 360; - int16_t deg_range = bg_end - arc->bg_angle_start; + const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ + const uint32_t tolerance_deg = (360U * LV_DPX(50U)) / circumference; + const uint32_t min_close_prev = (uint32_t) arc->min_close; + + const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, (uint32_t) angle, tolerance_deg); + if(!is_angle_within_bg_bounds) { + return; + } + int16_t deg_range = bg_end - arc->bg_angle_start; int16_t last_angle_rel = arc->last_angle - arc->bg_angle_start; int16_t delta_angle = angle - last_angle_rel; - /*Do not allow big jumps. + /*Do not allow big jumps (jumps bigger than 280°). *It's mainly to avoid jumping to the opposite end if the "dead" range between min. and max. is crossed. *Check which end was closer on the last valid press (arc->min_close) and prefer that end*/ if(LV_ABS(delta_angle) > 280) { if(arc->min_close) angle = 0; else angle = deg_range; } - else { - if(angle < deg_range / 2)arc->min_close = 1; - else arc->min_close = 0; + /* Check if click was outside the background arc start and end angles */ + else if(CLICK_OUTSIDE_BG_ANGLES == arc->in_out) { + if(arc->min_close) angle = -deg_range; + else angle = deg_range; } + else { /* Keep the angle value */ } + + /* Prevent big jumps when the click goes from start to end angle in the invisible + * part of the background arc without being released */ + if(((min_close_prev == CLICK_CLOSER_TO_MIN_END) && (arc->min_close == CLICK_CLOSER_TO_MAX_END)) + && ((CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (LV_ABS(delta_angle) > 280))) { + angle = 0; + } + else if(((min_close_prev == CLICK_CLOSER_TO_MAX_END) && (arc->min_close == CLICK_CLOSER_TO_MIN_END)) + && (CLICK_OUTSIDE_BG_ANGLES == arc->in_out)) { + angle = deg_range; + } + else { /* Keep the angle value */ } /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ delta_angle = angle - last_angle_rel; + uint32_t delta_tick = lv_tick_elaps(arc->last_tick); - int16_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; + /* delta_angle_max can never be signed. delta_tick is always signed, same for ch_rate */ + const uint16_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; if(delta_angle > delta_angle_max) { delta_angle = delta_angle_max; @@ -507,6 +539,7 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) else if(delta_angle < -delta_angle_max) { delta_angle = -delta_angle_max; } + else { /* Nothing to do */ } angle = last_angle_rel + delta_angle; /*Apply the limited angle change*/ @@ -563,7 +596,7 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) } } else if(code == LV_EVENT_HIT_TEST) { - lv_hit_test_info_t * info = lv_event_get_param(e);; + lv_hit_test_info_t * info = lv_event_get_param(e); lv_point_t p; lv_coord_t r; @@ -600,8 +633,11 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); lv_coord_t knob_pad = LV_MAX4(knob_left, knob_right, knob_top, knob_bottom) + 2; + lv_coord_t knob_extra_size = knob_pad - bg_pad; + knob_extra_size += knob_get_extra_size(obj); + lv_coord_t * s = lv_event_get_param(e); - *s = LV_MAX(*s, knob_pad - bg_pad); + *s = LV_MAX(*s, knob_extra_size); } else if(code == LV_EVENT_DRAW_MAIN) { lv_arc_draw(e); @@ -716,6 +752,7 @@ static void inv_arc_area(lv_obj_t * obj, uint16_t start_angle, uint16_t end_angl lv_area_t inv_area; lv_draw_arc_get_area(c.x, c.y, r, start_angle, end_angle, w, rounded, &inv_area); + lv_obj_invalidate_area(obj, &inv_area); } @@ -727,6 +764,13 @@ static void inv_knob_area(lv_obj_t * obj) lv_area_t a; get_knob_area(obj, &c, r, &a); + + lv_coord_t knob_extra_size = knob_get_extra_size(obj); + + if(knob_extra_size > 0) { + lv_area_increase(&a, knob_extra_size, knob_extra_size); + } + lv_obj_invalidate_area(obj, &a); } @@ -841,4 +885,136 @@ static void value_update(lv_obj_t * obj) arc->last_angle = angle; /*Cache angle for slew rate limiting*/ } +static lv_coord_t knob_get_extra_size(lv_obj_t * obj) +{ + lv_coord_t knob_shadow_size = 0; + knob_shadow_size += lv_obj_get_style_shadow_width(obj, LV_PART_KNOB); + knob_shadow_size += lv_obj_get_style_shadow_spread(obj, LV_PART_KNOB); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_ofs_x(obj, LV_PART_KNOB)); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_ofs_y(obj, LV_PART_KNOB)); + + lv_coord_t knob_outline_size = 0; + knob_outline_size += lv_obj_get_style_outline_width(obj, LV_PART_KNOB); + knob_outline_size += lv_obj_get_style_outline_pad(obj, LV_PART_KNOB); + + return LV_MAX(knob_shadow_size, knob_outline_size); +} + +/** + * Check if angle is within arc background bounds + * + * In order to avoid unexpected value update of the arc value when the user clicks + * outside of the arc background we need to check if the angle (of the clicked point) + * is within the bounds of the background. + * + * A tolerance (extra room) also should be taken into consideration. + * + * E.g. Arc with start angle of 0° and end angle of 90°, the background is only visible in + * that range, from 90° to 360° the background is invisible. Click in 150° should not update + * the arc value, click within the arc angle range should. + * + * IMPORTANT NOTE: angle is always relative to bg_angle_start, e.g. if bg_angle_start is 30 + * and we click a bit to the left, angle is 10, not the expected 40. + * + * @param obj Pointer to lv_arc + * @param angle Angle to be checked + * @param tolerance_deg Tolerance + * + * @return true if angle is within arc background bounds, false otherwise + */ +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const uint32_t angle, const uint32_t tolerance_deg) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + uint32_t smaller_angle = 0; + uint32_t bigger_angle = 0; + + /* Determine which background angle is smaller and bigger */ + if(arc->bg_angle_start < arc->bg_angle_end) { + bigger_angle = arc->bg_angle_end; + smaller_angle = arc->bg_angle_start; + } + else { + bigger_angle = (360 - arc->bg_angle_start) + arc->bg_angle_end; + smaller_angle = 0; + } + + /* Angle is between both background angles */ + if((smaller_angle <= angle) && (angle <= bigger_angle)) { + + if(((bigger_angle - smaller_angle) / 2U) >= angle) { + arc->min_close = 1; + } + else { + arc->min_close = 0; + } + + arc->in_out = CLICK_INSIDE_BG_ANGLES; + + return true; + } + /* Distance between background start and end angles is less than tolerance, + * consider the click inside the arc */ + else if(((smaller_angle - tolerance_deg) <= 0U) && + (360U - (bigger_angle + (smaller_angle - tolerance_deg)))) { + + arc->min_close = 1; + arc->in_out = CLICK_INSIDE_BG_ANGLES; + return true; + } + else { /* Case handled below */ } + + /* Legends: + * 0° = angle 0 + * 360° = angle 360 + * T: Tolerance + * A: Angle + * S: Arc background start angle + * E: Arc background end angle + * + * Start angle is bigger or equal to tolerance */ + if((smaller_angle >= tolerance_deg) + /* (360° - T) --- A --- 360° */ + && ((angle >= (360U - tolerance_deg)) && (angle <= 360U))) { + + arc->min_close = 1; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* Tolerance is bigger than bg start angle */ + else if((smaller_angle < tolerance_deg) + /* (360° - (T - S)) --- A --- 360° */ + && (((360U - (tolerance_deg - smaller_angle)) <= angle)) && (angle <= 360U)) { + + arc->min_close = 1; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* 360° is bigger than background end angle + tolerance */ + else if((360U >= (bigger_angle + tolerance_deg)) + /* E --- A --- (E + T) */ + && ((bigger_angle <= (angle + smaller_angle)) && + ((angle + smaller_angle) <= (bigger_angle + tolerance_deg)))) { + + arc->min_close = 0; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* Background end angle + tolerance is bigger than 360° and bg_start_angle + tolerance is not near 0° + ((bg_end_angle + tolerance) - 360°) + * Here we can assume background is not near 0° because of the first two initial checks */ + else if((360U < (bigger_angle + tolerance_deg)) + && (angle <= 0U + ((bigger_angle + tolerance_deg) - 360U)) && (angle > bigger_angle)) { + + arc->min_close = 0; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + else { + /* Nothing to do */ + } + + return false; +} + #endif diff --git a/lib/lvgl/src/widgets/lv_arc.h b/lib/lvgl/src/widgets/lv_arc.h index fd53fc1..6a8a072 100644 --- a/lib/lvgl/src/widgets/lv_arc.h +++ b/lib/lvgl/src/widgets/lv_arc.h @@ -44,10 +44,11 @@ typedef struct { int16_t value; /*Current value of the arc*/ int16_t min_value; /*Minimum value of the arc*/ int16_t max_value; /*Maximum value of the arc*/ - uint16_t dragging : 1; - uint16_t type : 2; - uint16_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ - uint16_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ + uint32_t dragging : 1; + uint32_t type : 2; + uint32_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ + uint32_t in_out : 1; /* 1: The click was within the background arc angles. 0: Click outside */ + uint32_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ uint32_t last_tick; /*Last dragging event timestamp of the arc*/ int16_t last_angle; /*Last dragging angle of the arc*/ } lv_arc_t; diff --git a/lib/lvgl/src/widgets/lv_bar.c b/lib/lvgl/src/widgets/lv_bar.c index 0da2a98..a057618 100644 --- a/lib/lvgl/src/widgets/lv_bar.c +++ b/lib/lvgl/src/widgets/lv_bar.c @@ -571,6 +571,8 @@ static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_ _lv_bar_anim_t * anim_info, lv_anim_enable_t en) { if(en == LV_ANIM_OFF) { + lv_anim_del(anim_info, NULL); + anim_info->anim_state = LV_BAR_ANIM_STATE_INV; *value_ptr = new_value; lv_obj_invalidate((lv_obj_t *)obj); } diff --git a/lib/lvgl/src/widgets/lv_btnmatrix.c b/lib/lvgl/src/widgets/lv_btnmatrix.c index 92a4d2f..fd14e56 100644 --- a/lib/lvgl/src/widgets/lv_btnmatrix.c +++ b/lib/lvgl/src/widgets/lv_btnmatrix.c @@ -23,7 +23,7 @@ #define MY_CLASS &lv_btnmatrix_class #define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) -#define LV_BTNMATRIX_WIDTH_MASK 0x0007 +#define LV_BTNMATRIX_WIDTH_MASK 0x000F /********************** * TYPEDEFS @@ -208,7 +208,7 @@ void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctr { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; if(btn_id >= btnm->btn_cnt) return; @@ -216,6 +216,19 @@ void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctr lv_btnmatrix_clear_btn_ctrl_all(obj, LV_BTNMATRIX_CTRL_CHECKED); } + /* If we hide a button if all buttons are now hidden hide the whole button matrix to make focus behave correctly */ + if(ctrl & LV_BTNMATRIX_CTRL_HIDDEN) { + bool all_buttons_hidden = true; + if(btnm->btn_cnt > 1) { + for(uint16_t btn_idx = 0; btn_idx < btnm->btn_cnt; btn_idx++) { + if(btn_idx == btn_id) continue; + if(!(btnm->ctrl_bits[btn_idx] & LV_BTNMATRIX_CTRL_HIDDEN)) all_buttons_hidden = false; + } + + } + if(all_buttons_hidden) lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + } + btnm->ctrl_bits[btn_id] |= ctrl; invalidate_button_area(obj, btn_id); @@ -228,10 +241,15 @@ void lv_btnmatrix_clear_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_c { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; if(btn_id >= btnm->btn_cnt) return; + /* If all buttons were hidden the whole button matrix is hidden so we need to check and remove hidden flag if present */ + if(ctrl & LV_BTNMATRIX_CTRL_HIDDEN) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); + } + btnm->ctrl_bits[btn_id] &= (~ctrl); invalidate_button_area(obj, btn_id); @@ -422,6 +440,7 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_indev_get_point(param, &p); btn_pr = get_button_from_point(obj, &p); /*Handle the case where there is no button there*/ + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; if(btn_pr != LV_BTNMATRIX_BTN_NONE) { if(button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { @@ -429,6 +448,9 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the new area*/ } } + else { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + } } if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) { @@ -520,6 +542,8 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; } else if(code == LV_EVENT_FOCUSED) { + if(btnm->btn_cnt == 0) return; + lv_indev_t * indev = lv_event_get_param(e); lv_indev_type_t indev_type = lv_indev_get_type(indev); @@ -563,9 +587,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) else btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_LEFT) { @@ -574,9 +604,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; else btnm->btn_id_sel = btnm->btn_cnt - 1; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_DOWN) { @@ -586,7 +622,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { @@ -614,7 +653,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { diff --git a/lib/lvgl/src/widgets/lv_btnmatrix.h b/lib/lvgl/src/widgets/lv_btnmatrix.h index 780d57b..2edf202 100644 --- a/lib/lvgl/src/widgets/lv_btnmatrix.h +++ b/lib/lvgl/src/widgets/lv_btnmatrix.h @@ -32,18 +32,19 @@ LV_EXPORT_CONST_INT(LV_BTNMATRIX_BTN_NONE); /** Type to store button control bits (disabled, hidden etc.) * The first 3 bits are used to store the width*/ enum { - _LV_BTNMATRIX_WIDTH = 0x0007, /**< Reserved to stire the size units*/ - LV_BTNMATRIX_CTRL_HIDDEN = 0x0008, /**< Button hidden*/ - LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0010, /**< Do not repeat press this button.*/ - LV_BTNMATRIX_CTRL_DISABLED = 0x0020, /**< Disable this button.*/ - LV_BTNMATRIX_CTRL_CHECKABLE = 0x0040, /**< The button can be toggled.*/ - LV_BTNMATRIX_CTRL_CHECKED = 0x0080, /**< Button is currently toggled (e.g. checked).*/ - LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ - LV_BTNMATRIX_CTRL_POPOVER = 0x0200, /**< Show a popover when pressing this key*/ - LV_BTNMATRIX_CTRL_RECOLOR = 0x1000, /**< Enable text recoloring with `#color`*/ - _LV_BTNMATRIX_CTRL_RESERVED = 0x2000, /**< Reserved for later use*/ - LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ - LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ + _LV_BTNMATRIX_WIDTH = 0x000F, /**< Reserved to store the size units*/ + LV_BTNMATRIX_CTRL_HIDDEN = 0x0010, /**< Button hidden*/ + LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not repeat press this button.*/ + LV_BTNMATRIX_CTRL_DISABLED = 0x0040, /**< Disable this button.*/ + LV_BTNMATRIX_CTRL_CHECKABLE = 0x0080, /**< The button can be toggled.*/ + LV_BTNMATRIX_CTRL_CHECKED = 0x0100, /**< Button is currently toggled (e.g. checked).*/ + LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ + LV_BTNMATRIX_CTRL_POPOVER = 0x0400, /**< Show a popover when pressing this key*/ + LV_BTNMATRIX_CTRL_RECOLOR = 0x0800, /**< Enable text recoloring with `#color`*/ + _LV_BTNMATRIX_CTRL_RESERVED_1 = 0x1000, /**< Reserved for later use*/ + _LV_BTNMATRIX_CTRL_RESERVED_2 = 0x2000, /**< Reserved for later use*/ + LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ + LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ }; typedef uint16_t lv_btnmatrix_ctrl_t; diff --git a/lib/lvgl/src/widgets/lv_canvas.c b/lib/lvgl/src/widgets/lv_canvas.c index 6b37069..1f94927 100644 --- a/lib/lvgl/src/widgets/lv_canvas.c +++ b/lib/lvgl/src/widgets/lv_canvas.c @@ -181,10 +181,10 @@ void lv_canvas_transform(lv_obj_t * obj, lv_img_dsc_t * src_img, int16_t angle, draw_dsc.antialias = antialias; lv_area_t dest_area; - dest_area.x1 = 0; - dest_area.x2 = dest_img->header.w - 1; - dest_area.y1 = 0; - dest_area.y2 = 0; + dest_area.x1 = -offset_x; + dest_area.x2 = dest_area.x1 + dest_img->header.w - 1; + dest_area.y1 = -offset_y; + dest_area.y2 = -offset_y; lv_color_t * cbuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_color_t)); lv_opa_t * abuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_opa_t)); @@ -194,15 +194,12 @@ void lv_canvas_transform(lv_obj_t * obj, lv_img_dsc_t * src_img, int16_t angle, &draw_dsc, canvas->dsc.header.cf, cbuf, abuf); for(x = 0; x < dest_img->header.w; x++) { - if(x + offset_x < 0) continue; - if(x + offset_x >= dest_img->header.w) break; if(abuf[x]) { - lv_img_buf_set_px_color(dest_img, x + offset_x, y + offset_y, cbuf[x]); - lv_img_buf_set_px_alpha(dest_img, x + offset_x, y + offset_y, abuf[x]); + lv_img_buf_set_px_color(dest_img, x, y, cbuf[x]); + lv_img_buf_set_px_alpha(dest_img, x, y, abuf[x]); } } - if(y + offset_y >= dest_img->header.h) break; dest_area.y1++; dest_area.y2++; } diff --git a/lib/lvgl/src/widgets/lv_checkbox.c b/lib/lvgl/src/widgets/lv_checkbox.c index dd3b3d1..fa79b37 100644 --- a/lib/lvgl/src/widgets/lv_checkbox.c +++ b/lib/lvgl/src/widgets/lv_checkbox.c @@ -74,14 +74,16 @@ void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) size_t len = strlen(txt); #endif - if(!cb->static_txt) cb->txt = lv_mem_realloc(cb->txt, len + 1); - else cb->txt = lv_mem_alloc(len + 1); + char * _txt = (char *)cb->txt; + if(!cb->static_txt) _txt = lv_mem_realloc(_txt, len + 1); + else _txt = lv_mem_alloc(len + 1); #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_txt_ap_proc(txt, cb->txt); + _lv_txt_ap_proc(txt, _txt); #else - strcpy(cb->txt, txt); + strcpy(_txt, txt); #endif + cb->txt = _txt; cb->static_txt = 0; lv_obj_refresh_self_size(obj); @@ -92,7 +94,7 @@ void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) { lv_checkbox_t * cb = (lv_checkbox_t *)obj; - if(!cb->static_txt) lv_mem_free(cb->txt); + if(!cb->static_txt) lv_mem_free((void *)cb->txt); cb->txt = (char *)txt; cb->static_txt = 1; @@ -138,7 +140,7 @@ static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * ob lv_checkbox_t * cb = (lv_checkbox_t *)obj; if(!cb->static_txt) { - lv_mem_free(cb->txt); + lv_mem_free((void *)cb->txt); cb->txt = NULL; } LV_TRACE_OBJ_CREATE("finished"); diff --git a/lib/lvgl/src/widgets/lv_checkbox.h b/lib/lvgl/src/widgets/lv_checkbox.h index 772f500..11405bd 100644 --- a/lib/lvgl/src/widgets/lv_checkbox.h +++ b/lib/lvgl/src/widgets/lv_checkbox.h @@ -28,7 +28,7 @@ extern "C" { typedef struct { lv_obj_t obj; - char * txt; + const char * txt; uint32_t static_txt : 1; } lv_checkbox_t; diff --git a/lib/lvgl/src/widgets/lv_dropdown.c b/lib/lvgl/src/widgets/lv_dropdown.c index 241d177..765bdde 100644 --- a/lib/lvgl/src/widgets/lv_dropdown.c +++ b/lib/lvgl/src/widgets/lv_dropdown.c @@ -285,6 +285,10 @@ void lv_dropdown_set_selected(lv_obj_t * obj, uint16_t sel_opt) dropdown->sel_opt_id = sel_opt < dropdown->option_cnt ? sel_opt : dropdown->option_cnt - 1; dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + if(dropdown->list) { + position_to_selected(obj); + } + lv_obj_invalidate(obj); } @@ -403,14 +407,19 @@ int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option) const char * opts = lv_dropdown_get_options(obj); uint32_t char_i = 0; uint32_t opt_i = 0; + uint32_t option_len = strlen(option); const char * start = opts; while(start[char_i] != '\0') { for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++); - if(memcmp(start, option, LV_MIN(strlen(option), char_i)) == 0) return opt_i; + if(option_len == char_i && memcmp(start, option, LV_MIN(option_len, char_i)) == 0) { + return opt_i; + } + start = &start[char_i]; if(start[0] == '\n') start++; + char_i = 0; opt_i++; } diff --git a/lib/lvgl/src/widgets/lv_img.c b/lib/lvgl/src/widgets/lv_img.c index f47a789..3246e4a 100644 --- a/lib/lvgl/src/widgets/lv_img.c +++ b/lib/lvgl/src/widgets/lv_img.c @@ -166,8 +166,6 @@ void lv_img_set_offset_x(lv_obj_t * obj, lv_coord_t x) lv_img_t * img = (lv_img_t *)obj; - x = x % img->w; - img->offset.x = x; lv_obj_invalidate(obj); } @@ -178,15 +176,14 @@ void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y) lv_img_t * img = (lv_img_t *)obj; - y = y % img->h; - img->offset.y = y; lv_obj_invalidate(obj); } void lv_img_set_angle(lv_obj_t * obj, int16_t angle) { - if(angle < 0 || angle >= 3600) angle = angle % 3600; + while(angle >= 3600) angle -= 3600; + while(angle < 0) angle += 3600; lv_img_t * img = (lv_img_t *)obj; if(angle == img->angle) return; @@ -659,12 +656,14 @@ static void draw_img(lv_event_t * e) draw_ctx->clip_area = &img_clip_area; lv_area_t coords_tmp; - coords_tmp.y1 = img_max_area.y1 + img->offset.y; + lv_coord_t offset_x = img->offset.x % img->w; + lv_coord_t offset_y = img->offset.y % img->h; + coords_tmp.y1 = img_max_area.y1 + offset_y; if(coords_tmp.y1 > img_max_area.y1) coords_tmp.y1 -= img->h; coords_tmp.y2 = coords_tmp.y1 + img->h - 1; for(; coords_tmp.y1 < img_max_area.y2; coords_tmp.y1 += img_size_final.y, coords_tmp.y2 += img_size_final.y) { - coords_tmp.x1 = img_max_area.x1 + img->offset.x; + coords_tmp.x1 = img_max_area.x1 + offset_x; if(coords_tmp.x1 > img_max_area.x1) coords_tmp.x1 -= img->w; coords_tmp.x2 = coords_tmp.x1 + img->w - 1; diff --git a/lib/lvgl/src/widgets/lv_roller.c b/lib/lvgl/src/widgets/lv_roller.c index fd9b394..f79e882 100644 --- a/lib/lvgl/src/widgets/lv_roller.c +++ b/lib/lvgl/src/widgets/lv_roller.c @@ -477,6 +477,7 @@ static void draw_main(lv_event_t * e) area_ok = _lv_area_intersect(&mask_sel, draw_ctx->clip_area, &sel_area); if(area_ok) { lv_obj_t * label = get_label(obj); + if(lv_label_get_recolor(label)) label_dsc.flag |= LV_TEXT_FLAG_RECOLOR; /*Get the size of the "selected text"*/ lv_point_t res_p; @@ -529,6 +530,8 @@ static void draw_label(lv_event_t * e) lv_draw_label_dsc_t label_draw_dsc; lv_draw_label_dsc_init(&label_draw_dsc); lv_obj_init_draw_label_dsc(roller, LV_PART_MAIN, &label_draw_dsc); + if(lv_label_get_recolor(label_obj)) label_draw_dsc.flag |= LV_TEXT_FLAG_RECOLOR; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); /*If the roller has shadow or outline it has some ext. draw size diff --git a/lib/lvgl/src/widgets/lv_slider.c b/lib/lvgl/src/widgets/lv_slider.c index 9c820c2..98711da 100644 --- a/lib/lvgl/src/widgets/lv_slider.c +++ b/lib/lvgl/src/widgets/lv_slider.c @@ -212,7 +212,7 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) /*Make the point relative to the indicator*/ new_value = p.x - (obj->coords.x1 + bg_left); } - new_value = (new_value * range) / indic_w; + new_value = (new_value * range + indic_w / 2) / indic_w; new_value += slider->bar.min_value; } else { @@ -223,7 +223,7 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) /*Make the point relative to the indicator*/ new_value = p.y - (obj->coords.y2 + bg_bottom); - new_value = (-new_value * range) / indic_h; + new_value = (-new_value * range + indic_h / 2) / indic_h; new_value += slider->bar.min_value; } @@ -239,8 +239,12 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) new_value = LV_CLAMP(real_min_value, new_value, real_max_value); if(*slider->value_to_set != new_value) { - *slider->value_to_set = new_value; - lv_obj_invalidate(obj); + if(slider->value_to_set == &slider->bar.start_value) { + lv_bar_set_start_value(obj, new_value, LV_ANIM_ON); + } + else { + lv_bar_set_value(obj, new_value, LV_ANIM_ON); + } res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return; } diff --git a/lib/lvgl/src/widgets/lv_table.c b/lib/lvgl/src/widgets/lv_table.c index 5ff65ab..968cf87 100644 --- a/lib/lvgl/src/widgets/lv_table.c +++ b/lib/lvgl/src/widgets/lv_table.c @@ -40,8 +40,9 @@ static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row); static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col); static lv_res_t get_pressed_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col); static size_t get_cell_txt_len(const char * txt); -static void copy_cell_txt(char * dst, const char * txt); +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt); static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t * area); +static void scroll_to_selected_cell(lv_obj_t * obj); static inline bool is_cell_empty(void * cell) { @@ -97,7 +98,14 @@ void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const c lv_table_cell_ctrl_t ctrl = 0; /*Save the control byte*/ - if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + +#if LV_USE_USER_DATA + void * user_data = NULL; + + /*Save the user data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; +#endif size_t to_allocate = get_cell_txt_len(txt); @@ -107,7 +115,10 @@ void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const c copy_cell_txt(table->cell_data[cell], txt); - table->cell_data[cell][0] = ctrl; + table->cell_data[cell]->ctrl = ctrl; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = user_data; +#endif refr_cell_size(obj, row, col); } @@ -130,7 +141,14 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, con lv_table_cell_ctrl_t ctrl = 0; /*Save the control byte*/ - if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + +#if LV_USE_USER_DATA + void * user_data = NULL; + + /*Save the user_data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; +#endif va_list ap, ap2; va_start(ap, fmt); @@ -153,32 +171,35 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, con /*Get the size of the Arabic text and process it*/ size_t len_ap = _lv_txt_ap_calc_bytes_cnt(raw_txt); - table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len_ap + 1); + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], sizeof(lv_table_cell_t) + len_ap + 1); LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) { va_end(ap2); return; } - _lv_txt_ap_proc(raw_txt, &table->cell_data[cell][1]); + _lv_txt_ap_proc(raw_txt, table->cell_data[cell]->txt); lv_mem_buf_release(raw_txt); #else - table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len + 2); /*+1: trailing '\0; +1: format byte*/ + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], + sizeof(lv_table_cell_t) + len + 1); /*+1: trailing '\0; */ LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) { va_end(ap2); return; } - table->cell_data[cell][len + 1] = 0; /*Ensure NULL termination*/ + table->cell_data[cell]->txt[len] = 0; /*Ensure NULL termination*/ - lv_vsnprintf(&table->cell_data[cell][1], len + 1, fmt, ap2); + lv_vsnprintf(table->cell_data[cell]->txt, len + 1, fmt, ap2); #endif va_end(ap2); - table->cell_data[cell][0] = ctrl; - + table->cell_data[cell]->ctrl = ctrl; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = user_data; +#endif refr_cell_size(obj, row, col); } @@ -203,11 +224,17 @@ void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt) uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; uint32_t i; for(i = new_cell_cnt; i < old_cell_cnt; i++) { +#if LV_USE_USER_DATA + if(table->cell_data[i]->user_data) { + lv_mem_free(table->cell_data[i]->user_data); + table->cell_data[i]->user_data = NULL; + } +#endif lv_mem_free(table->cell_data[i]); } } - table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(char *)); + table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); LV_ASSERT_MALLOC(table->cell_data); if(table->cell_data == NULL) return; @@ -232,7 +259,7 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt) uint16_t old_col_cnt = table->col_cnt; table->col_cnt = col_cnt; - char ** new_cell_data = lv_mem_alloc(table->row_cnt * table->col_cnt * sizeof(char *)); + lv_table_cell_t ** new_cell_data = lv_mem_alloc(table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); LV_ASSERT_MALLOC(new_cell_data); if(new_cell_data == NULL) return; uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; @@ -255,6 +282,12 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt) int32_t i; for(i = 0; i < (int32_t)old_col_cnt - col_cnt; i++) { uint32_t idx = old_col_start + min_col_cnt + i; +#if LV_USE_USER_DATA + if(table->cell_data[idx]->user_data) { + lv_mem_free(table->cell_data[idx]->user_data); + table->cell_data[idx]->user_data = NULL; + } +#endif lv_mem_free(table->cell_data[idx]); table->cell_data[idx] = NULL; } @@ -303,15 +336,18 @@ void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table uint32_t cell = row * table->col_cnt + col; if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ + table->cell_data[cell] = lv_mem_alloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) return; - table->cell_data[cell][0] = 0; - table->cell_data[cell][1] = '\0'; + table->cell_data[cell]->ctrl = 0; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = NULL; +#endif + table->cell_data[cell]->txt[0] = '\0'; } - table->cell_data[cell][0] |= ctrl; + table->cell_data[cell]->ctrl |= ctrl; } void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl) @@ -327,16 +363,50 @@ void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_tab uint32_t cell = row * table->col_cnt + col; if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ + table->cell_data[cell] = lv_mem_alloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = NULL; +#endif + table->cell_data[cell]->txt[0] = '\0'; + } + + table->cell_data[cell]->ctrl &= (~ctrl); +} + +#if LV_USE_USER_DATA +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_col_cnt(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_cnt(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_mem_alloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) return; - table->cell_data[cell][0] = 0; - table->cell_data[cell][1] = '\0'; + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + if(table->cell_data[cell]->user_data) { + lv_mem_free(table->cell_data[cell]->user_data); } - table->cell_data[cell][0] &= (~ctrl); + table->cell_data[cell]->user_data = user_data; } +#endif /*===================== * Getter functions @@ -355,7 +425,7 @@ const char * lv_table_get_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col) if(is_cell_empty(table->cell_data[cell])) return ""; - return &table->cell_data[cell][1]; /*Skip the format byte*/ + return table->cell_data[cell]->txt; } uint16_t lv_table_get_row_cnt(lv_obj_t * obj) @@ -400,7 +470,7 @@ bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table uint32_t cell = row * table->col_cnt + col; if(is_cell_empty(table->cell_data[cell])) return false; - else return (table->cell_data[cell][0] & ctrl) == ctrl; + else return (table->cell_data[cell]->ctrl & ctrl) == ctrl; } void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col) @@ -410,6 +480,24 @@ void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col) *col = table->col_act; } +#if LV_USE_USER_DATA +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return NULL; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return NULL; + + return table->cell_data[cell]->user_data; +} +#endif + /********************** * STATIC FUNCTIONS **********************/ @@ -427,7 +515,7 @@ static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) table->row_h = lv_mem_alloc(table->row_cnt * sizeof(table->row_h[0])); table->col_w[0] = LV_DPI_DEF; table->row_h[0] = LV_DPI_DEF; - table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(char *)); + table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); table->cell_data[0] = NULL; LV_TRACE_OBJ_CREATE("finished"); @@ -441,6 +529,12 @@ static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) uint16_t i; for(i = 0; i < table->col_cnt * table->row_cnt; i++) { if(table->cell_data[i]) { +#if LV_USE_USER_DATA + if(table->cell_data[i]->user_data) { + lv_mem_free(table->cell_data[i]->user_data); + table->cell_data[i]->user_data = NULL; + } +#endif lv_mem_free(table->cell_data[i]); table->cell_data[i] = NULL; } @@ -516,6 +610,7 @@ static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) if(col == LV_TABLE_CELL_NONE || row == LV_TABLE_CELL_NONE) { table->col_act = 0; table->row_act = 0; + scroll_to_selected_cell(obj); lv_obj_invalidate(obj); return; } @@ -560,6 +655,8 @@ static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) table->row_act = row; lv_obj_invalidate(obj); + scroll_to_selected_cell(obj); + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return; } @@ -635,7 +732,7 @@ static void draw_main(lv_event_t * e) for(col = 0; col < table->col_cnt; col++) { lv_table_cell_ctrl_t ctrl = 0; - if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; if(rtl) { cell_area.x2 = cell_area.x1 - 1; @@ -648,11 +745,11 @@ static void draw_main(lv_event_t * e) uint16_t col_merge = 0; for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { - char * next_cell_data = table->cell_data[cell + col_merge]; + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; if(is_cell_empty(next_cell_data)) break; - lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data[0]; + lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { lv_coord_t offset = table->col_w[col + col_merge + 1]; @@ -735,7 +832,7 @@ static void draw_main(lv_event_t * e) bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP ? true : false; if(crop) txt_flags = LV_TEXT_FLAG_EXPAND; - lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, label_dsc_def.font, + lv_txt_get_size(&txt_size, table->cell_data[cell]->txt, label_dsc_def.font, label_dsc_act.letter_space, label_dsc_act.line_space, lv_area_get_width(&txt_area), txt_flags); @@ -750,7 +847,7 @@ static void draw_main(lv_event_t * e) label_mask_ok = _lv_area_intersect(&label_clip_area, &clip_area, &cell_area); if(label_mask_ok) { draw_ctx->clip_area = &label_clip_area; - lv_draw_label(draw_ctx, &label_dsc_act, &txt_area, table->cell_data[cell] + 1, NULL); + lv_draw_label(draw_ctx, &label_dsc_act, &txt_area, table->cell_data[cell]->txt, NULL); draw_ctx->clip_area = &clip_area; } } @@ -841,7 +938,7 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ uint16_t cell; uint16_t col; for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) { - char * cell_data = table->cell_data[cell]; + lv_table_cell_t * cell_data = table->cell_data[cell]; if(is_cell_empty(cell_data)) { continue; @@ -854,11 +951,11 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ uint16_t col_merge = 0; for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { - char * next_cell_data = table->cell_data[cell + col_merge]; + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; if(is_cell_empty(next_cell_data)) break; - lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data[0]; + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { txt_w += table->col_w[col + col_merge + 1]; } @@ -867,7 +964,7 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ } } - lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data[0]; + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data->ctrl; /*When cropping the text we can assume the row height is equal to the line height*/ if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) { @@ -879,7 +976,7 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ lv_point_t txt_size; txt_w -= cell_left + cell_right; - lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, font, + lv_txt_get_size(&txt_size, table->cell_data[cell]->txt, font, letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE); h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max); @@ -949,23 +1046,21 @@ static size_t get_cell_txt_len(const char * txt) size_t retval = 0; #if LV_USE_ARABIC_PERSIAN_CHARS - retval = _lv_txt_ap_calc_bytes_cnt(txt) + 1; + retval = sizeof(lv_table_cell_t) + _lv_txt_ap_calc_bytes_cnt(txt) + 1; #else - /* cell_data layout: [ctrl][txt][trailing '\0' terminator] - * +2 because of the trailing '\0' and the ctrl */ - retval = strlen(txt) + 2; + retval = sizeof(lv_table_cell_t) + strlen(txt) + 1; #endif return retval; } /* Copy txt into dst skipping the format byte */ -static void copy_cell_txt(char * dst, const char * txt) +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt) { #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_txt_ap_proc(txt, &dst[1]); + _lv_txt_ap_proc(txt, dst->txt); #else - strcpy(&dst[1], txt); + strcpy(dst->txt, txt); #endif } @@ -1004,4 +1099,26 @@ static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t } + +static void scroll_to_selected_cell(lv_obj_t * obj) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_area_t a; + get_cell_area(obj, table->row_act, table->col_act, &a); + if(a.x1 < 0) { + lv_obj_scroll_by_bounded(obj, -a.x1, 0, LV_ANIM_ON); + } + else if(a.x2 > lv_obj_get_width(obj)) { + lv_obj_scroll_by_bounded(obj, lv_obj_get_width(obj) - a.x2, 0, LV_ANIM_ON); + } + + if(a.y1 < 0) { + lv_obj_scroll_by_bounded(obj, 0, -a.y1, LV_ANIM_ON); + } + else if(a.y2 > lv_obj_get_height(obj)) { + lv_obj_scroll_by_bounded(obj, 0, lv_obj_get_height(obj) - a.y2, LV_ANIM_ON); + } + +} #endif diff --git a/lib/lvgl/src/widgets/lv_table.h b/lib/lvgl/src/widgets/lv_table.h index 9106270..9c60a76 100644 --- a/lib/lvgl/src/widgets/lv_table.h +++ b/lib/lvgl/src/widgets/lv_table.h @@ -46,12 +46,21 @@ enum { typedef uint8_t lv_table_cell_ctrl_t; +/*Data of cell*/ +typedef struct { + lv_table_cell_ctrl_t ctrl; +#if LV_USE_USER_DATA + void * user_data; /**< Custom user data*/ +#endif + char txt[]; +} lv_table_cell_t; + /*Data of table*/ typedef struct { lv_obj_t obj; uint16_t col_cnt; uint16_t row_cnt; - char ** cell_data; + lv_table_cell_t ** cell_data; lv_coord_t * row_h; lv_coord_t * col_w; uint16_t col_act; @@ -144,6 +153,17 @@ void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table */ void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl); +#if LV_USE_USER_DATA +/** + * Add custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param user_data pointer to the new user_data. It must be allocated by user as it will be freed automatically + */ +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data); +#endif + /*===================== * Getter functions *====================*/ @@ -197,6 +217,16 @@ bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table */ void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col); +#if LV_USE_USER_DATA +/** + * Get custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + */ +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col); +#endif + /********************** * MACROS **********************/ diff --git a/lib/lvgl/tests/CMakeLists.txt b/lib/lvgl/tests/CMakeLists.txt index 147c8c1..0792db7 100644 --- a/lib/lvgl/tests/CMakeLists.txt +++ b/lib/lvgl/tests/CMakeLists.txt @@ -334,6 +334,7 @@ add_library(test_common src/test_fonts/font_1.c src/test_fonts/font_2.c src/test_fonts/font_3.c + src/test_fonts/ubuntu_font.c unity/unity_support.c unity/unity.c ) @@ -363,7 +364,7 @@ foreach( test_case_fname ${TEST_CASE_FILES} ) ${test_case_fname} ${test_runner_fname} ) - target_link_libraries(${test_name} test_common lvgl_examples lvgl_demos lvgl png ${TEST_LIBS}) + target_link_libraries(${test_name} test_common lvgl_examples lvgl_demos lvgl png m ${TEST_LIBS}) target_include_directories(${test_name} PUBLIC ${TEST_INCLUDE_DIRS}) target_compile_options(${test_name} PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS}) diff --git a/lib/lvgl/tests/makefile/Makefile b/lib/lvgl/tests/makefile/Makefile index bcfe5da..486d1e1 100644 --- a/lib/lvgl/tests/makefile/Makefile +++ b/lib/lvgl/tests/makefile/Makefile @@ -2,7 +2,7 @@ LVGL_DIR := $(CURDIR)/../.. include ../../lvgl.mk CSRCS += test.c -CFLAGS += -DLV_CONF_SKIP=1 -I$(LVGL_DIR)/.. +CFLAGS += -DLV_CONF_SKIP=1 -DLV_BUILD_TEST=1 -I$(LVGL_DIR)/.. COBJS := $(patsubst %.c, %.o, $(CSRCS)) test_file: $(COBJS) diff --git a/lib/lvgl/tests/makefile/test.c b/lib/lvgl/tests/makefile/test.c index a9f6aa2..e725ade 100644 --- a/lib/lvgl/tests/makefile/test.c +++ b/lib/lvgl/tests/makefile/test.c @@ -1,3 +1,4 @@ +#if LV_BUILD_TEST #include #include "lvgl/lvgl.h" @@ -5,3 +6,4 @@ int main(void) { lv_init(); return 0; } +#endif diff --git a/lib/lvgl/tests/ref_imgs/arc_1.png b/lib/lvgl/tests/ref_imgs/arc_1.png new file mode 100644 index 0000000..52743cb Binary files /dev/null and b/lib/lvgl/tests/ref_imgs/arc_1.png differ diff --git a/lib/lvgl/tests/ref_imgs/arc_2.png b/lib/lvgl/tests/ref_imgs/arc_2.png new file mode 100644 index 0000000..6f0dc47 Binary files /dev/null and b/lib/lvgl/tests/ref_imgs/arc_2.png differ diff --git a/lib/lvgl/tests/ref_imgs/dropdown_1.png b/lib/lvgl/tests/ref_imgs/dropdown_1.png index 30bf0bb..2793014 100644 Binary files a/lib/lvgl/tests/ref_imgs/dropdown_1.png and b/lib/lvgl/tests/ref_imgs/dropdown_1.png differ diff --git a/lib/lvgl/tests/ref_imgs/tiny_ttf_1.png b/lib/lvgl/tests/ref_imgs/tiny_ttf_1.png new file mode 100644 index 0000000..2c2034b Binary files /dev/null and b/lib/lvgl/tests/ref_imgs/tiny_ttf_1.png differ diff --git a/lib/lvgl/tests/src/lv_test_conf.h b/lib/lvgl/tests/src/lv_test_conf.h index d47fe63..a1ab215 100644 --- a/lib/lvgl/tests/src/lv_test_conf.h +++ b/lib/lvgl/tests/src/lv_test_conf.h @@ -20,6 +20,8 @@ extern "C" { * DEFINES *********************/ +#define LV_USE_TINY_TTF 1 + void lv_test_assert_fail(void); #define LV_ASSERT_HANDLER lv_test_assert_fail(); diff --git a/lib/lvgl/tests/src/test_cases/test_arc.c b/lib/lvgl/tests/src/test_cases/test_arc.c index adb3037..4dfaa02 100644 --- a/lib/lvgl/tests/src/test_cases/test_arc.c +++ b/lib/lvgl/tests/src/test_cases/test_arc.c @@ -158,6 +158,53 @@ void test_arc_click_area_with_adv_hittest(void) TEST_ASSERT_EQUAL_UINT32(0, event_cnt); } +/* Check value doesn't go to max when clicking on the other side of the arc */ +void test_arc_click_sustained_from_start_to_end_does_not_set_value_to_max(void) +{ + arc = lv_arc_create(lv_scr_act()); + lv_arc_set_value(arc, 0); + + lv_obj_set_size(arc, 100, 100); + lv_obj_center(arc); + lv_obj_add_event_cb(arc, dummy_event_cb, LV_EVENT_PRESSED, NULL); + event_cnt = 0; + + /* Click close to start angle */ + event_cnt = 0; + lv_test_mouse_move_to(376, 285); + lv_test_mouse_press(); + lv_test_indev_wait(50); + lv_test_mouse_release(); + lv_test_indev_wait(50); + + TEST_ASSERT_EQUAL_UINT32(1, event_cnt); + TEST_ASSERT_EQUAL_UINT32(lv_arc_get_value(arc), lv_arc_get_min_value(arc)); + + /* Click close to end angle */ + event_cnt = 0; + + lv_test_mouse_move_to(376, 285); + lv_test_mouse_press(); + lv_test_indev_wait(50); + lv_test_mouse_move_to(415, 281); + lv_test_indev_wait(50); + lv_test_mouse_release(); + lv_test_indev_wait(50); + + TEST_ASSERT_EQUAL_UINT32(1, event_cnt); + TEST_ASSERT_NOT_EQUAL_UINT32(lv_arc_get_value(arc), lv_arc_get_max_value(arc)); + + TEST_ASSERT_EQUAL_SCREENSHOT("arc_2.png"); +} + +void test_arc_basic_render(void) +{ + arc = lv_arc_create(lv_scr_act()); + lv_obj_set_size(arc, 100, 100); + lv_obj_center(arc); + TEST_ASSERT_EQUAL_SCREENSHOT("arc_1.png"); +} + static void dummy_event_cb(lv_event_t * e) { LV_UNUSED(e); diff --git a/lib/lvgl/tests/src/test_cases/test_dropdown.c b/lib/lvgl/tests/src/test_cases/test_dropdown.c index a49cc1d..3a0767f 100644 --- a/lib/lvgl/tests/src/test_cases/test_dropdown.c +++ b/lib/lvgl/tests/src/test_cases/test_dropdown.c @@ -355,10 +355,10 @@ void test_dropdown_render_1(void) lv_dropdown_set_options(dd3, "a0\na1\na2\na3\na4\na5\na6\na7\na8\na9\na10\na11\na12\na13\na14\na15\na16"); lv_dropdown_open(dd3); - lv_dropdown_set_selected(dd3, 3); lv_obj_t * list = lv_dropdown_get_list(dd3); lv_obj_set_style_text_line_space(list, 5, 0); lv_obj_set_style_bg_color(list, lv_color_hex3(0xf00), LV_PART_SELECTED | LV_STATE_CHECKED); + lv_dropdown_set_selected(dd3, 3); TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_1.png"); diff --git a/lib/lvgl/tests/src/test_cases/test_tiny_ttf.c b/lib/lvgl/tests/src/test_cases/test_tiny_ttf.c new file mode 100644 index 0000000..574e526 --- /dev/null +++ b/lib/lvgl/tests/src/test_cases/test_tiny_ttf.c @@ -0,0 +1,49 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include "unity/unity.h" + +void setUp(void) +{ + /* Function run before every test */ +} + +void tearDown(void) +{ + /* Function run after every test */ +} + +void test_tiny_ttf_rendering_test(void) +{ +#if LV_USE_TINY_TTF + /*Create a font*/ + extern const uint8_t ubuntu_font[]; + extern size_t ubuntu_font_size; + lv_font_t * font = lv_tiny_ttf_create_data(ubuntu_font, ubuntu_font_size, 30); + + /*Create style with the new font*/ + static lv_style_t style; + lv_style_init(&style); + lv_style_set_text_font(&style, font); + lv_style_set_text_align(&style, LV_TEXT_ALIGN_CENTER); + lv_style_set_bg_opa(&style, LV_OPA_COVER); + lv_style_set_bg_color(&style, lv_color_hex(0xffaaaa)); + + /*Create a label with the new style*/ + lv_obj_t * label = lv_label_create(lv_scr_act()); + lv_obj_add_style(label, &style, 0); + lv_label_set_text(label, "Hello world\n" + "I'm a font created with Tiny TTF\n" + "Accents: ÁÉÍÓÖŐÜŰ áéíóöőüű"); + lv_obj_center(label); + + TEST_ASSERT_EQUAL_SCREENSHOT("tiny_ttf_1.png"); + + lv_obj_del(label); + lv_tiny_ttf_destroy(font); +#else + TEST_PASS(); +#endif +} + +#endif diff --git a/lib/lvgl/tests/src/test_fonts/ubuntu_font.c b/lib/lvgl/tests/src/test_fonts/ubuntu_font.c new file mode 100644 index 0000000..56467be --- /dev/null +++ b/lib/lvgl/tests/src/test_fonts/ubuntu_font.c @@ -0,0 +1,11970 @@ +#include +#include + +const uint8_t ubuntu_font[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x53, 0x49, 0x47, + 0x1b, 0x79, 0x61, 0x63, 0x00, 0x02, 0xd2, 0x78, 0x00, 0x00, 0x19, 0x30, 0x47, 0x53, 0x55, 0x42, + 0x0f, 0xff, 0x5a, 0xb8, 0x00, 0x02, 0xa9, 0x3c, 0x00, 0x00, 0x29, 0x3c, 0x4f, 0x53, 0x2f, 0x32, + 0x89, 0xee, 0x00, 0xb2, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x00, 0x60, 0x56, 0x44, 0x4d, 0x58, + 0x6c, 0x3c, 0x73, 0xda, 0x00, 0x00, 0x0c, 0x1c, 0x00, 0x00, 0x05, 0xe0, 0x63, 0x6d, 0x61, 0x70, + 0xf6, 0x78, 0x50, 0x3f, 0x00, 0x00, 0x11, 0xfc, 0x00, 0x00, 0x06, 0x86, 0x63, 0x76, 0x74, 0x20, + 0x39, 0x1e, 0x29, 0x66, 0x00, 0x00, 0x1f, 0xcc, 0x00, 0x00, 0x01, 0x76, 0x66, 0x70, 0x67, 0x6d, + 0x76, 0xbd, 0x44, 0xc4, 0x00, 0x00, 0x18, 0x84, 0x00, 0x00, 0x06, 0x23, 0x67, 0x61, 0x73, 0x70, + 0xff, 0xff, 0x00, 0x03, 0x00, 0x02, 0xa9, 0x34, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6c, 0x79, 0x66, + 0x2f, 0x97, 0x44, 0x0e, 0x00, 0x00, 0x35, 0x88, 0x00, 0x02, 0x40, 0x6c, 0x68, 0x65, 0x61, 0x64, + 0xf4, 0xc1, 0x1f, 0x12, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, + 0x05, 0x35, 0x00, 0xa7, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, + 0x35, 0xc2, 0x2e, 0x2f, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x0a, 0x22, 0x6c, 0x6f, 0x63, 0x61, + 0x06, 0x3a, 0x83, 0x48, 0x00, 0x00, 0x21, 0x44, 0x00, 0x00, 0x14, 0x44, 0x6d, 0x61, 0x78, 0x70, + 0x0b, 0x80, 0x09, 0x9f, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x91, 0xf0, 0xf2, 0x7c, 0x00, 0x02, 0x75, 0xf4, 0x00, 0x00, 0x04, 0x89, 0x70, 0x6f, 0x73, 0x74, + 0x33, 0xda, 0xb4, 0xf4, 0x00, 0x02, 0x7a, 0x80, 0x00, 0x00, 0x2e, 0xb1, 0x70, 0x72, 0x65, 0x70, + 0xf6, 0x58, 0xc3, 0xbb, 0x00, 0x00, 0x1e, 0xa8, 0x00, 0x00, 0x01, 0x23, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0xcc, 0x37, 0x91, 0x47, 0x0b, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x09, 0x03, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0xc9, 0xe5, 0xbe, 0xcb, 0x00, 0x00, 0x00, 0x00, 0xca, 0xa6, 0x4f, 0xff, + 0xfe, 0x7e, 0xff, 0x56, 0x02, 0x99, 0x03, 0x3f, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x3e, 0xff, 0x56, 0x00, 0x00, 0x01, 0xf4, + 0xff, 0x5b, 0xff, 0x5b, 0x02, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x05, 0x10, 0x01, 0x54, + 0x00, 0x55, 0x00, 0x6a, 0x00, 0x07, 0x00, 0x02, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x59, 0x00, 0x00, + 0x05, 0xa7, 0x07, 0xaf, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x01, 0xf4, 0x02, 0xbc, 0x00, 0x05, + 0x00, 0x00, 0x02, 0xbc, 0x02, 0x8a, 0x00, 0x00, 0x00, 0x8c, 0x02, 0xbc, 0x02, 0x8a, 0x00, 0x00, + 0x01, 0xdd, 0x00, 0x32, 0x00, 0xfa, 0x00, 0x00, 0x02, 0x0b, 0x08, 0x09, 0x03, 0x06, 0x02, 0x03, + 0x02, 0x04, 0xe0, 0x00, 0x02, 0xff, 0x50, 0x00, 0x20, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x41, 0x4d, 0x41, 0x00, 0x20, 0x00, 0x00, 0xff, 0xfd, 0x02, 0xb5, 0xff, 0x5b, + 0x00, 0x31, 0x03, 0x3e, 0x00, 0xaa, 0x20, 0x00, 0x00, 0x9f, 0x56, 0x01, 0x00, 0x00, 0x02, 0x08, + 0x02, 0xb5, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0x01, 0xf4, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa7, 0x00, 0x57, 0x00, 0x12, 0x00, 0x22, 0x00, 0x02, 0x00, 0x15, 0x00, 0xba, + 0x00, 0x5e, 0x00, 0x55, 0x00, 0x2e, 0x00, 0x28, 0x00, 0x7e, 0x00, 0x71, 0x00, 0xa1, 0x00, 0x2f, + 0x00, 0x23, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x29, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x31, + 0x00, 0x26, 0x00, 0x2d, 0x00, 0xa1, 0x00, 0x76, 0x00, 0x2d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x45, + 0x00, 0x12, 0x00, 0x09, 0x00, 0x36, 0x00, 0x1b, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x1b, + 0x00, 0x2d, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x1b, + 0x00, 0x36, 0x00, 0x1b, 0x00, 0x36, 0x00, 0x28, 0x00, 0x19, 0x00, 0x27, 0x00, 0x0d, 0x00, 0x17, + 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x2e, 0x00, 0x71, 0x00, 0x31, 0x00, 0x6d, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x98, 0x00, 0x2c, 0x00, 0x3e, 0x00, 0x2c, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x21, + 0x00, 0x3f, 0x00, 0x24, 0x00, 0x31, 0x00, 0x3f, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x3f, 0x00, 0x1d, + 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x59, 0x00, 0x36, 0x00, 0x24, 0x00, 0x3b, 0x00, 0x0e, 0x00, 0x0b, + 0x00, 0x14, 0x00, 0x14, 0x00, 0x43, 0x00, 0x3f, 0x00, 0xbd, 0x00, 0x3f, 0x00, 0x15, 0x00, 0x1f, + 0x00, 0x7e, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x3a, 0x00, 0x70, 0x00, 0x09, + 0x00, 0x28, 0x00, 0x84, 0x00, 0x12, 0x00, 0x90, 0x00, 0x90, 0x00, 0x29, 0x00, 0x1d, 0x00, 0x72, + 0x00, 0x36, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x12, 0x00, 0x36, 0x00, 0x9b, 0x00, 0x16, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0xa7, 0x00, 0x2e, 0x00, 0x26, 0x00, 0x14, 0x00, 0x0d, 0x00, 0xbd, 0x00, 0x31, + 0x00, 0x53, 0x00, 0x19, 0x00, 0x68, 0x00, 0x32, 0x00, 0x2d, 0x00, 0x71, 0x00, 0x19, 0x00, 0x6c, + 0x00, 0x6c, 0x00, 0x28, 0x00, 0x71, 0x00, 0x71, 0x00, 0x98, 0x00, 0x3b, 0x00, 0x13, 0x00, 0xa1, + 0x00, 0x9f, 0x00, 0x81, 0x00, 0x4a, 0x00, 0x32, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x45, + 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x1b, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, + 0x00, 0x12, 0x00, 0x2e, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x3c, + 0x00, 0x1b, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, 0x0d, 0x00, 0x36, 0x00, 0x1f, + 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x17, 0x00, 0x2c, + 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x28, 0x00, 0x3f, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x28, + 0x00, 0x1d, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x14, 0x00, 0x3f, 0x00, 0x14, + 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, + 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x0d, + 0x00, 0x12, 0x00, 0x1c, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, + 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1b, 0x00, 0x21, + 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x12, 0x00, 0x19, + 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, 0x00, 0x24, + 0x00, 0x36, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x37, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x2d, + 0x00, 0x3f, 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x24, 0x00, 0x47, 0x00, 0x24, 0x00, 0x47, + 0x00, 0x24, 0x00, 0x47, 0x00, 0x24, 0xff, 0xf6, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x2e, + 0x00, 0x3f, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x09, 0xff, 0xe6, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x36, 0x00, 0x59, 0x00, 0x36, + 0x00, 0x23, 0x00, 0x36, 0x00, 0x59, 0x00, 0x28, 0x00, 0x36, 0x00, 0x28, 0x00, 0x36, 0x00, 0x28, + 0x00, 0x36, 0x00, 0x19, 0x00, 0x24, 0x00, 0x19, 0x00, 0x24, 0x00, 0x19, 0x00, 0x24, 0x00, 0x27, + 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, + 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x2e, + 0x00, 0x43, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x8b, 0x00, 0x28, 0x00, 0x36, + 0x00, 0x19, 0x00, 0x24, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x70, 0x00, 0x6a, 0x00, 0x69, 0x00, 0xb3, + 0x00, 0x91, 0x00, 0xa3, 0x00, 0x43, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x17, + 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x19, 0x00, 0x66, 0x00, 0x59, 0x00, 0x71, 0x00, 0x62, + 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x66, 0x00, 0x81, 0x00, 0x71, 0x00, 0x71, 0x00, 0x59, + 0x00, 0x71, 0x00, 0x62, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x35, 0x00, 0x1b, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x05, 0x00, 0x16, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1d, + 0x00, 0x09, 0x00, 0x28, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x28, 0x00, 0x19, 0x00, 0xa7, 0x00, 0x09, + 0x00, 0x0e, 0x00, 0x31, 0x00, 0x15, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x12, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x66, 0x00, 0x81, 0x00, 0x71, 0x00, 0x71, 0x00, 0x59, + 0x00, 0x71, 0x00, 0x62, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x66, 0x00, 0x81, 0x00, 0x71, + 0x00, 0x71, 0x00, 0x59, 0x00, 0x71, 0x00, 0x62, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0xc4, + 0x00, 0xa4, 0x00, 0xa1, 0x00, 0xc4, 0x00, 0x5e, 0x00, 0x55, 0x00, 0x71, 0x00, 0x2f, 0x00, 0x12, + 0x00, 0x71, 0x00, 0x31, 0x00, 0x6d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x84, 0x00, 0x72, 0x00, 0x36, + 0x00, 0x00, 0x00, 0x9b, 0x00, 0xa9, 0x00, 0x32, 0x00, 0x32, 0x00, 0x45, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x36, 0x00, 0x3f, 0xff, 0xf2, 0xff, 0xfc, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x28, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x19, 0x00, 0x1f, 0xff, 0xcc, + 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x20, 0x00, 0x36, 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x3b, + 0x00, 0x12, 0x00, 0x14, 0xff, 0xbc, 0x00, 0x3f, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1e, + 0x00, 0x17, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x36, 0x00, 0x28, 0x00, 0x36, 0x00, 0x1c, 0x00, 0x09, + 0x00, 0x24, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x19, 0x00, 0x27, 0x00, 0x29, 0x00, 0x09, 0x00, 0x27, + 0x00, 0x0d, 0x00, 0x14, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x36, 0x00, 0x2d, + 0x00, 0x1c, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x35, 0x00, 0x3f, 0x00, 0xbd, 0x00, 0x5c, 0x00, 0x16, + 0x00, 0xa7, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x12, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x1d, + 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, + 0x00, 0x27, 0x00, 0x3b, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1a, 0x00, 0x1f, 0x00, 0x31, 0x00, 0x12, 0x00, 0x12, + 0x00, 0x09, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x36, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x09, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x3c, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, + 0x00, 0x24, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x2c, 0x00, 0x4f, 0x00, 0x36, + 0x00, 0x59, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x22, 0x00, 0x4b, 0x00, 0x2d, + 0x00, 0x37, 0x00, 0x2d, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x24, + 0x00, 0x18, 0x00, 0x18, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x12, 0xff, 0xfc, 0x00, 0x24, + 0x00, 0x43, 0x00, 0x37, 0x00, 0x3c, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x36, 0x00, 0x16, + 0x00, 0x2a, 0x00, 0x31, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, + 0x00, 0x1f, 0x00, 0x69, 0x00, 0x4f, 0x00, 0xa1, 0x00, 0x6d, 0x00, 0x86, 0x00, 0x4a, 0x00, 0x4a, + 0x00, 0x4a, 0x00, 0x6f, 0x00, 0x8b, 0x00, 0x77, 0x00, 0x77, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4d, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x12, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x28, 0x00, 0x36, 0x00, 0x36, + 0x00, 0x2a, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x2d, + 0x00, 0x09, 0x00, 0x36, 0x00, 0x36, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x3f, 0x00, 0x09, 0x00, 0x17, + 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x08, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x1b, 0x00, 0x2d, + 0x00, 0x36, 0x00, 0x1b, 0x00, 0x19, 0x00, 0x05, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x2d, 0x00, 0x2d, + 0x00, 0x17, 0x00, 0x17, 0x00, 0x12, 0x00, 0x22, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x1e, 0x00, 0x14, + 0x00, 0x2c, 0x00, 0x28, 0x00, 0x44, 0x00, 0x59, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x33, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x11, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x1d, 0x00, 0x3f, + 0x00, 0x3f, 0x00, 0x2c, 0x00, 0x26, 0x00, 0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x3f, 0x00, 0x2b, + 0x00, 0x20, 0x00, 0x20, 0x00, 0x12, 0x00, 0x22, 0x00, 0x36, 0x00, 0x18, 0x00, 0x17, 0x00, 0x14, + 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x59, 0x00, 0x27, 0x00, 0x36, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x31, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x19, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x14, 0x00, 0x3f, + 0x00, 0x1f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x2e, + 0x00, 0x3f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x24, 0x00, 0x59, 0x00, 0x24, + 0x00, 0x12, 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x33, 0x00, 0x2d, + 0x00, 0x3f, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1b, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x2d, + 0x00, 0x3b, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x24, 0x00, 0x24, 0x00, 0x12, 0x00, 0x11, 0x00, 0x1b, + 0x00, 0x2c, 0x00, 0x19, 0x00, 0x26, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0b, + 0x00, 0x14, 0x00, 0x11, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x36, + 0x00, 0x3f, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x36, 0x00, 0x09, 0x00, 0x0e, + 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x08, 0x00, 0x11, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x2d, 0x00, 0x3b, + 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x17, 0x00, 0x18, 0x00, 0x36, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x09, 0x00, 0x17, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x19, + 0x00, 0x1f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x33, 0x00, 0x1a, 0x00, 0x1f, 0x00, 0x2e, + 0x00, 0x3f, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x18, 0x00, 0x05, 0x00, 0x14, 0x00, 0x05, 0x00, 0x14, 0x00, 0x05, + 0x00, 0x14, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x24, 0x00, 0x59, 0x00, 0x22, 0x00, 0x22, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x19, 0x00, 0x19, 0x00, 0x12, 0x00, 0x60, 0x00, 0x09, 0x00, 0x36, + 0x00, 0x24, 0x00, 0x09, 0x00, 0x3f, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x16, 0x00, 0x36, 0x00, 0x2d, + 0x00, 0x09, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x1c, + 0x00, 0x19, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x09, 0x00, 0x28, 0x00, 0x36, + 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x40, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x3f, + 0x00, 0x13, 0x00, 0x3b, 0x00, 0x0e, 0x00, 0x35, 0x00, 0x1d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x2d, + 0x00, 0x1d, 0x00, 0x24, 0x00, 0x33, 0x00, 0x18, 0x00, 0x14, 0x00, 0x18, 0x00, 0x19, 0xff, 0xe8, + 0xff, 0x7b, 0xff, 0x6a, 0xff, 0x6d, 0x00, 0x36, 0xff, 0x80, 0xff, 0x5a, 0x00, 0x0d, 0xff, 0x80, + 0x00, 0x28, 0x00, 0x40, 0x00, 0x3f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x33, + 0x00, 0x33, 0x00, 0x26, 0x00, 0x19, 0x00, 0x97, 0x00, 0xab, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0xff, 0xe0, 0xff, 0xcb, + 0xfe, 0xfb, 0xff, 0x17, 0xff, 0x36, 0xff, 0x29, 0xff, 0x77, 0xff, 0x78, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0xff, 0x6b, 0xff, 0x7b, 0xfe, 0xa4, 0xfe, 0xbf, + 0xfe, 0xc3, 0xfe, 0xb2, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, + 0x00, 0x3f, 0x00, 0x3f, 0xff, 0x5a, 0xff, 0x66, 0xfe, 0x90, 0xfe, 0xad, 0xfe, 0xb0, 0xfe, 0x9e, + 0xfe, 0xf6, 0xfe, 0xf6, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x24, 0x00, 0x24, 0xff, 0x64, 0xff, 0x60, 0xfe, 0x99, 0xfe, 0xb5, 0xfe, 0xb9, 0xfe, 0xa7, + 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, + 0xff, 0x7d, 0xff, 0x60, 0xfe, 0x99, 0xfe, 0xb5, 0xfe, 0xcf, 0xfe, 0xba, 0x00, 0x33, 0x00, 0x33, + 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0xff, 0x72, 0xfe, 0xc7, + 0xfe, 0x9a, 0xfe, 0xdb, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, + 0x00, 0x19, 0x00, 0x19, 0xff, 0x6b, 0xff, 0x47, 0xfe, 0x7e, 0xfe, 0x9c, 0xfe, 0xcb, 0xfe, 0xbd, + 0xfe, 0xff, 0xfe, 0xfe, 0x00, 0x28, 0x00, 0x28, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3f, 0x00, 0x3f, + 0x00, 0x24, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x33, 0x00, 0x33, 0x00, 0x19, 0x00, 0x19, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, + 0xff, 0xaa, 0xff, 0x9e, 0xfe, 0xc5, 0xfe, 0xe2, 0xfe, 0xf7, 0xfe, 0xea, 0xff, 0x2e, 0xff, 0x2e, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, + 0xff, 0x51, 0xff, 0x5d, 0xfe, 0x87, 0xfe, 0xa4, 0xfe, 0xa7, 0xfe, 0x9b, 0xfe, 0xe0, 0xfe, 0xe0, + 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, + 0xff, 0x6b, 0xff, 0x47, 0xfe, 0x7e, 0xfe, 0x9c, 0xfe, 0xcb, 0xfe, 0xbd, 0xfe, 0xff, 0xfe, 0xfe, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x09, + 0x00, 0x09, 0xff, 0x67, 0xff, 0x8b, 0x00, 0x09, 0x00, 0xab, 0x00, 0xa4, 0x00, 0xab, 0x00, 0x69, + 0x00, 0x5e, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0xff, 0x39, 0xff, 0x42, + 0xff, 0x27, 0xff, 0x31, 0x00, 0x12, 0x00, 0x40, 0x00, 0x4e, 0x00, 0x6e, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x15, 0x00, 0x15, 0x00, 0x24, 0x00, 0x24, 0x00, 0x36, 0x00, 0x36, 0xff, 0x25, 0xff, 0x1f, + 0x00, 0x4f, 0x00, 0x48, 0x00, 0x6e, 0x00, 0x33, 0x00, 0x33, 0x00, 0x26, 0x00, 0x26, 0x00, 0x3f, + 0x00, 0x3f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0d, 0x00, 0x0d, 0xff, 0x37, 0xff, 0x27, 0xff, 0x57, + 0x00, 0x26, 0x00, 0x26, 0x00, 0x85, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, + 0xff, 0x14, 0xff, 0x44, 0xfe, 0xfa, 0xff, 0x33, 0x00, 0x09, 0x00, 0x85, 0x00, 0xab, 0xff, 0xaa, + 0xff, 0xa7, 0xfe, 0xd7, 0xfe, 0xf4, 0xff, 0x1b, 0xff, 0x0e, 0xff, 0x5c, 0xff, 0x5d, 0xff, 0x5a, + 0xff, 0x66, 0xfe, 0x90, 0xfe, 0xad, 0xfe, 0xb0, 0xfe, 0x9e, 0xfe, 0xf6, 0xfe, 0xf6, 0xff, 0x6b, + 0xff, 0x47, 0xfe, 0x7e, 0xfe, 0x9c, 0xfe, 0xcb, 0xfe, 0xbd, 0xfe, 0xff, 0xfe, 0xfe, 0x00, 0x09, + 0x00, 0x2d, 0x00, 0x09, 0x00, 0x2e, 0x00, 0x39, 0xff, 0x5b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, + 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0c, 0x00, 0xf8, 0x08, 0xff, 0x00, 0x08, 0x00, 0x08, + 0xff, 0xfe, 0x00, 0x09, 0x00, 0x09, 0xff, 0xfe, 0x00, 0x0a, 0x00, 0x09, 0xff, 0xfe, 0x00, 0x0b, + 0x00, 0x0a, 0xff, 0xfe, 0x00, 0x0c, 0x00, 0x0b, 0xff, 0xfe, 0x00, 0x0d, 0x00, 0x0b, 0xff, 0xfe, + 0x00, 0x0e, 0x00, 0x0d, 0xff, 0xfe, 0x00, 0x0f, 0x00, 0x0d, 0xff, 0xfd, 0x00, 0x10, 0x00, 0x0e, + 0xff, 0xfd, 0x00, 0x11, 0x00, 0x0f, 0xff, 0xfd, 0x00, 0x12, 0x00, 0x0f, 0xff, 0xfd, 0x00, 0x13, + 0x00, 0x10, 0xff, 0xfd, 0x00, 0x14, 0x00, 0x11, 0xff, 0xfd, 0x00, 0x15, 0x00, 0x12, 0xff, 0xfc, + 0x00, 0x16, 0x00, 0x13, 0xff, 0xfc, 0x00, 0x17, 0x00, 0x14, 0xff, 0xfc, 0x00, 0x18, 0x00, 0x14, + 0xff, 0xfc, 0x00, 0x19, 0x00, 0x15, 0xff, 0xfc, 0x00, 0x1a, 0x00, 0x16, 0xff, 0xfc, 0x00, 0x1b, + 0x00, 0x17, 0xff, 0xfb, 0x00, 0x1c, 0x00, 0x17, 0xff, 0xfb, 0x00, 0x1d, 0x00, 0x18, 0xff, 0xfb, + 0x00, 0x1e, 0x00, 0x19, 0xff, 0xfb, 0x00, 0x1f, 0x00, 0x1a, 0xff, 0xfb, 0x00, 0x20, 0x00, 0x1b, + 0xff, 0xfb, 0x00, 0x21, 0x00, 0x1c, 0xff, 0xfa, 0x00, 0x22, 0x00, 0x1d, 0xff, 0xfa, 0x00, 0x23, + 0x00, 0x1d, 0xff, 0xfa, 0x00, 0x24, 0x00, 0x1e, 0xff, 0xfa, 0x00, 0x25, 0x00, 0x1f, 0xff, 0xfa, + 0x00, 0x26, 0x00, 0x20, 0xff, 0xfa, 0x00, 0x27, 0x00, 0x20, 0xff, 0xf9, 0x00, 0x28, 0x00, 0x22, + 0xff, 0xf9, 0x00, 0x29, 0x00, 0x22, 0xff, 0xf9, 0x00, 0x2a, 0x00, 0x24, 0xff, 0xf8, 0x00, 0x2b, + 0x00, 0x25, 0xff, 0xf8, 0x00, 0x2c, 0x00, 0x25, 0xff, 0xf8, 0x00, 0x2d, 0x00, 0x26, 0xff, 0xf8, + 0x00, 0x2e, 0x00, 0x27, 0xff, 0xf7, 0x00, 0x2f, 0x00, 0x28, 0xff, 0xf7, 0x00, 0x30, 0x00, 0x29, + 0xff, 0xf7, 0x00, 0x31, 0x00, 0x29, 0xff, 0xf7, 0x00, 0x32, 0x00, 0x2a, 0xff, 0xf7, 0x00, 0x33, + 0x00, 0x2b, 0xff, 0xf7, 0x00, 0x34, 0x00, 0x2b, 0xff, 0xf6, 0x00, 0x35, 0x00, 0x2d, 0xff, 0xf6, + 0x00, 0x36, 0x00, 0x2e, 0xff, 0xf6, 0x00, 0x37, 0x00, 0x2e, 0xff, 0xf6, 0x00, 0x38, 0x00, 0x2f, + 0xff, 0xf6, 0x00, 0x39, 0x00, 0x30, 0xff, 0xf6, 0x00, 0x3a, 0x00, 0x31, 0xff, 0xf5, 0x00, 0x3b, + 0x00, 0x32, 0xff, 0xf5, 0x00, 0x3c, 0x00, 0x32, 0xff, 0xf5, 0x00, 0x3d, 0x00, 0x33, 0xff, 0xf5, + 0x00, 0x3e, 0x00, 0x34, 0xff, 0xf5, 0x00, 0x3f, 0x00, 0x35, 0xff, 0xf5, 0x00, 0x40, 0x00, 0x36, + 0xff, 0xf4, 0x00, 0x41, 0x00, 0x36, 0xff, 0xf4, 0x00, 0x42, 0x00, 0x37, 0xff, 0xf4, 0x00, 0x43, + 0x00, 0x38, 0xff, 0xf4, 0x00, 0x44, 0x00, 0x39, 0xff, 0xf4, 0x00, 0x45, 0x00, 0x3a, 0xff, 0xf4, + 0x00, 0x46, 0x00, 0x3b, 0xff, 0xf3, 0x00, 0x47, 0x00, 0x3b, 0xff, 0xf3, 0x00, 0x48, 0x00, 0x3c, + 0xff, 0xf3, 0x00, 0x49, 0x00, 0x3d, 0xff, 0xf3, 0x00, 0x4a, 0x00, 0x3e, 0xff, 0xf3, 0x00, 0x4b, + 0x00, 0x3f, 0xff, 0xf3, 0x00, 0x4c, 0x00, 0x40, 0xff, 0xf2, 0x00, 0x4d, 0x00, 0x41, 0xff, 0xf2, + 0x00, 0x4e, 0x00, 0x41, 0xff, 0xf2, 0x00, 0x4f, 0x00, 0x42, 0xff, 0xf2, 0x00, 0x50, 0x00, 0x43, + 0xff, 0xf2, 0x00, 0x51, 0x00, 0x44, 0xff, 0xf2, 0x00, 0x52, 0x00, 0x44, 0xff, 0xf1, 0x00, 0x53, + 0x00, 0x46, 0xff, 0xf1, 0x00, 0x54, 0x00, 0x46, 0xff, 0xf1, 0x00, 0x55, 0x00, 0x47, 0xff, 0xf1, + 0x00, 0x56, 0x00, 0x48, 0xff, 0xf1, 0x00, 0x57, 0x00, 0x49, 0xff, 0xf1, 0x00, 0x58, 0x00, 0x49, + 0xff, 0xf0, 0x00, 0x59, 0x00, 0x4a, 0xff, 0xf0, 0x00, 0x5a, 0x00, 0x4b, 0xff, 0xf0, 0x00, 0x5b, + 0x00, 0x4c, 0xff, 0xf0, 0x00, 0x5c, 0x00, 0x4d, 0xff, 0xf0, 0x00, 0x5d, 0x00, 0x4e, 0xff, 0xf0, + 0x00, 0x5e, 0x00, 0x4e, 0xff, 0xef, 0x00, 0x5f, 0x00, 0x4f, 0xff, 0xef, 0x00, 0x60, 0x00, 0x50, + 0xff, 0xef, 0x00, 0x61, 0x00, 0x51, 0xff, 0xef, 0x00, 0x62, 0x00, 0x52, 0xff, 0xef, 0x00, 0x63, + 0x00, 0x53, 0xff, 0xef, 0x00, 0x64, 0x00, 0x53, 0xff, 0xee, 0x00, 0x65, 0x00, 0x54, 0xff, 0xee, + 0x00, 0x66, 0x00, 0x55, 0xff, 0xee, 0x00, 0x67, 0x00, 0x56, 0xff, 0xee, 0x00, 0x68, 0x00, 0x57, + 0xff, 0xee, 0x00, 0x69, 0x00, 0x58, 0xff, 0xee, 0x00, 0x6a, 0x00, 0x58, 0xff, 0xee, 0x00, 0x6b, + 0x00, 0x59, 0xff, 0xed, 0x00, 0x6c, 0x00, 0x5a, 0xff, 0xed, 0x00, 0x6d, 0x00, 0x5b, 0xff, 0xed, + 0x00, 0x6e, 0x00, 0x5c, 0xff, 0xed, 0x00, 0x6f, 0x00, 0x5c, 0xff, 0xed, 0x00, 0x70, 0x00, 0x5e, + 0xff, 0xed, 0x00, 0x71, 0x00, 0x5e, 0xff, 0xec, 0x00, 0x72, 0x00, 0x5f, 0xff, 0xec, 0x00, 0x73, + 0x00, 0x60, 0xff, 0xeb, 0x00, 0x74, 0x00, 0x61, 0xff, 0xeb, 0x00, 0x75, 0x00, 0x61, 0xff, 0xeb, + 0x00, 0x76, 0x00, 0x62, 0xff, 0xeb, 0x00, 0x77, 0x00, 0x64, 0xff, 0xeb, 0x00, 0x78, 0x00, 0x65, + 0xff, 0xeb, 0x00, 0x79, 0x00, 0x65, 0xff, 0xeb, 0x00, 0x7a, 0x00, 0x66, 0xff, 0xea, 0x00, 0x7b, + 0x00, 0x66, 0xff, 0xea, 0x00, 0x7c, 0x00, 0x67, 0xff, 0xea, 0x00, 0x7d, 0x00, 0x68, 0xff, 0xea, + 0x00, 0x7e, 0x00, 0x6a, 0xff, 0xea, 0x00, 0x7f, 0x00, 0x6a, 0xff, 0xea, 0x00, 0x80, 0x00, 0x6b, + 0xff, 0xea, 0x00, 0x81, 0x00, 0x6b, 0xff, 0xea, 0x00, 0x82, 0x00, 0x6c, 0xff, 0xea, 0x00, 0x83, + 0x00, 0x6d, 0xff, 0xea, 0x00, 0x84, 0x00, 0x6e, 0xff, 0xea, 0x00, 0x85, 0x00, 0x6e, 0xff, 0xe9, + 0x00, 0x86, 0x00, 0x70, 0xff, 0xe9, 0x00, 0x87, 0x00, 0x70, 0xff, 0xe9, 0x00, 0x88, 0x00, 0x71, + 0xff, 0xe9, 0x00, 0x89, 0x00, 0x72, 0xff, 0xe9, 0x00, 0x8a, 0x00, 0x73, 0xff, 0xe9, 0x00, 0x8b, + 0x00, 0x73, 0xff, 0xe8, 0x00, 0x8c, 0x00, 0x75, 0xff, 0xe8, 0x00, 0x8d, 0x00, 0x76, 0xff, 0xe8, + 0x00, 0x8e, 0x00, 0x76, 0xff, 0xe8, 0x00, 0x8f, 0x00, 0x77, 0xff, 0xe8, 0x00, 0x90, 0x00, 0x78, + 0xff, 0xe8, 0x00, 0x91, 0x00, 0x78, 0xff, 0xe7, 0x00, 0x92, 0x00, 0x79, 0xff, 0xe7, 0x00, 0x93, + 0x00, 0x7a, 0xff, 0xe7, 0x00, 0x94, 0x00, 0x7b, 0xff, 0xe7, 0x00, 0x95, 0x00, 0x7c, 0xff, 0xe7, + 0x00, 0x96, 0x00, 0x7d, 0xff, 0xe6, 0x00, 0x97, 0x00, 0x7d, 0xff, 0xe6, 0x00, 0x98, 0x00, 0x7f, + 0xff, 0xe6, 0x00, 0x99, 0x00, 0x7f, 0xff, 0xe6, 0x00, 0x9a, 0x00, 0x80, 0xff, 0xe6, 0x00, 0x9b, + 0x00, 0x81, 0xff, 0xe6, 0x00, 0x9c, 0x00, 0x82, 0xff, 0xe5, 0x00, 0x9d, 0x00, 0x83, 0xff, 0xe5, + 0x00, 0x9e, 0x00, 0x84, 0xff, 0xe5, 0x00, 0x9f, 0x00, 0x84, 0xff, 0xe5, 0x00, 0xa0, 0x00, 0x85, + 0xff, 0xe5, 0x00, 0xa1, 0x00, 0x86, 0xff, 0xe5, 0x00, 0xa2, 0x00, 0x87, 0xff, 0xe4, 0x00, 0xa3, + 0x00, 0x88, 0xff, 0xe4, 0x00, 0xa4, 0x00, 0x89, 0xff, 0xe4, 0x00, 0xa5, 0x00, 0x89, 0xff, 0xe4, + 0x00, 0xa6, 0x00, 0x8a, 0xff, 0xe3, 0x00, 0xa7, 0x00, 0x8b, 0xff, 0xe3, 0x00, 0xa8, 0x00, 0x8b, + 0xff, 0xe3, 0x00, 0xa9, 0x00, 0x8c, 0xff, 0xe3, 0x00, 0xaa, 0x00, 0x8e, 0xff, 0xe3, 0x00, 0xab, + 0x00, 0x8e, 0xff, 0xe2, 0x00, 0xac, 0x00, 0x8f, 0xff, 0xe2, 0x00, 0xad, 0x00, 0x90, 0xff, 0xe2, + 0x00, 0xae, 0x00, 0x91, 0xff, 0xe2, 0x00, 0xaf, 0x00, 0x91, 0xff, 0xe2, 0x00, 0xb0, 0x00, 0x92, + 0xff, 0xe2, 0x00, 0xb1, 0x00, 0x93, 0xff, 0xe1, 0x00, 0xb2, 0x00, 0x94, 0xff, 0xe1, 0x00, 0xb3, + 0x00, 0x95, 0xff, 0xe1, 0x00, 0xb4, 0x00, 0x96, 0xff, 0xe1, 0x00, 0xb5, 0x00, 0x96, 0xff, 0xe1, + 0x00, 0xb6, 0x00, 0x97, 0xff, 0xe1, 0x00, 0xb7, 0x00, 0x98, 0xff, 0xe1, 0x00, 0xb8, 0x00, 0x99, + 0xff, 0xe0, 0x00, 0xb9, 0x00, 0x9a, 0xff, 0xe0, 0x00, 0xba, 0x00, 0x9b, 0xff, 0xe0, 0x00, 0xbb, + 0x00, 0x9b, 0xff, 0xe0, 0x00, 0xbc, 0x00, 0x9c, 0xff, 0xe0, 0x00, 0xbd, 0x00, 0x9d, 0xff, 0xe0, + 0x00, 0xbe, 0x00, 0x9e, 0xff, 0xdf, 0x00, 0xbf, 0x00, 0x9f, 0xff, 0xdf, 0x00, 0xc0, 0x00, 0xa0, + 0xff, 0xdf, 0x00, 0xc1, 0x00, 0xa1, 0xff, 0xdf, 0x00, 0xc2, 0x00, 0xa1, 0xff, 0xdf, 0x00, 0xc3, + 0x00, 0xa2, 0xff, 0xdf, 0x00, 0xc4, 0x00, 0xa3, 0xff, 0xde, 0x00, 0xc5, 0x00, 0xa4, 0xff, 0xde, + 0x00, 0xc6, 0x00, 0xa5, 0xff, 0xde, 0x00, 0xc7, 0x00, 0xa6, 0xff, 0xde, 0x00, 0xc8, 0x00, 0xa6, + 0xff, 0xde, 0x00, 0xc9, 0x00, 0xa7, 0xff, 0xde, 0x00, 0xca, 0x00, 0xa8, 0xff, 0xdd, 0x00, 0xcb, + 0x00, 0xa9, 0xff, 0xdd, 0x00, 0xcc, 0x00, 0xa9, 0xff, 0xdd, 0x00, 0xcd, 0x00, 0xab, 0xff, 0xdd, + 0x00, 0xce, 0x00, 0xac, 0xff, 0xdd, 0x00, 0xcf, 0x00, 0xac, 0xff, 0xdd, 0x00, 0xd0, 0x00, 0xad, + 0xff, 0xdd, 0x00, 0xd1, 0x00, 0xae, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0xae, 0xff, 0xdc, 0x00, 0xd3, + 0x00, 0xaf, 0xff, 0xdc, 0x00, 0xd4, 0x00, 0xb0, 0xff, 0xdc, 0x00, 0xd5, 0x00, 0xb2, 0xff, 0xdc, + 0x00, 0xd6, 0x00, 0xb2, 0xff, 0xdc, 0x00, 0xd7, 0x00, 0xb3, 0xff, 0xdb, 0x00, 0xd8, 0x00, 0xb3, + 0xff, 0xdb, 0x00, 0xd9, 0x00, 0xb4, 0xff, 0xdb, 0x00, 0xda, 0x00, 0xb5, 0xff, 0xdb, 0x00, 0xdb, + 0x00, 0xb6, 0xff, 0xdb, 0x00, 0xdc, 0x00, 0xb7, 0xff, 0xdb, 0x00, 0xdd, 0x00, 0xb8, 0xff, 0xda, + 0x00, 0xde, 0x00, 0xb9, 0xff, 0xda, 0x00, 0xdf, 0x00, 0xb9, 0xff, 0xda, 0x00, 0xe0, 0x00, 0xba, + 0xff, 0xda, 0x00, 0xe1, 0x00, 0xbb, 0xff, 0xda, 0x00, 0xe2, 0x00, 0xbc, 0xff, 0xda, 0x00, 0xe3, + 0x00, 0xbd, 0xff, 0xd9, 0x00, 0xe4, 0x00, 0xbe, 0xff, 0xd9, 0x00, 0xe5, 0x00, 0xbe, 0xff, 0xd9, + 0x00, 0xe6, 0x00, 0xbf, 0xff, 0xd9, 0x00, 0xe7, 0x00, 0xc0, 0xff, 0xd9, 0x00, 0xe8, 0x00, 0xc1, + 0xff, 0xd9, 0x00, 0xe9, 0x00, 0xc1, 0xff, 0xd8, 0x00, 0xea, 0x00, 0xc3, 0xff, 0xd8, 0x00, 0xeb, + 0x00, 0xc4, 0xff, 0xd8, 0x00, 0xec, 0x00, 0xc4, 0xff, 0xd8, 0x00, 0xed, 0x00, 0xc5, 0xff, 0xd8, + 0x00, 0xee, 0x00, 0xc6, 0xff, 0xd8, 0x00, 0xef, 0x00, 0xc6, 0xff, 0xd7, 0x00, 0xf0, 0x00, 0xc7, + 0xff, 0xd7, 0x00, 0xf1, 0x00, 0xc9, 0xff, 0xd7, 0x00, 0xf2, 0x00, 0xc9, 0xff, 0xd7, 0x00, 0xf3, + 0x00, 0xca, 0xff, 0xd7, 0x00, 0xf4, 0x00, 0xcb, 0xff, 0xd7, 0x00, 0xf5, 0x00, 0xcc, 0xff, 0xd6, + 0x00, 0xf6, 0x00, 0xcc, 0xff, 0xd6, 0x00, 0xf7, 0x00, 0xcd, 0xff, 0xd6, 0x00, 0xf8, 0x00, 0xce, + 0xff, 0xd6, 0x00, 0xf9, 0x00, 0xcf, 0xff, 0xd6, 0x00, 0xfa, 0x00, 0xd0, 0xff, 0xd5, 0x00, 0xfb, + 0x00, 0xd1, 0xff, 0xd5, 0x00, 0xfc, 0x00, 0xd2, 0xff, 0xd5, 0x00, 0xfd, 0x00, 0xd2, 0xff, 0xd5, + 0x00, 0xfe, 0x00, 0xd3, 0xff, 0xd5, 0x00, 0xff, 0x00, 0xd4, 0xff, 0xd5, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7c, + 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x04, 0x60, 0x00, 0x00, 0x00, 0xe2, + 0x00, 0x80, 0x00, 0x06, 0x00, 0x62, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x7e, + 0x01, 0x31, 0x01, 0x37, 0x01, 0x48, 0x01, 0x51, 0x01, 0x53, 0x01, 0x5f, 0x01, 0x61, 0x01, 0x77, + 0x01, 0x7f, 0x01, 0x91, 0x01, 0x92, 0x02, 0x17, 0x02, 0x1b, 0x02, 0x36, 0x02, 0x37, 0x02, 0x4f, + 0x02, 0x92, 0x02, 0xbc, 0x02, 0xc7, 0x02, 0xc9, 0x02, 0xdd, 0x03, 0x11, 0x03, 0x86, 0x03, 0x8a, + 0x03, 0x8c, 0x03, 0x90, 0x03, 0xa1, 0x03, 0xa9, 0x03, 0xb0, 0x03, 0xc9, 0x03, 0xce, 0x04, 0x5f, + 0x04, 0x63, 0x04, 0x75, 0x04, 0xf9, 0x1e, 0x85, 0x1e, 0xf3, 0x1f, 0x15, 0x1f, 0x1d, 0x1f, 0x45, + 0x1f, 0x4d, 0x1f, 0x57, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x7d, 0x1f, 0xb4, 0x1f, 0xc4, + 0x1f, 0xd3, 0x1f, 0xdb, 0x1f, 0xef, 0x1f, 0xf4, 0x1f, 0xfe, 0x20, 0x15, 0x20, 0x1a, 0x20, 0x1e, + 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x3a, 0x20, 0x44, 0x20, 0x70, 0x20, 0x79, 0x20, 0x89, + 0x20, 0xac, 0x20, 0xae, 0x20, 0xb4, 0x20, 0xb9, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, + 0x21, 0x2e, 0x21, 0x5e, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x12, 0x22, 0x15, 0x22, 0x1a, + 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, 0x25, 0x00, 0x25, 0x02, 0x25, 0x0c, + 0x25, 0x10, 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, 0x25, 0x2c, 0x25, 0x34, 0x25, 0x3c, + 0x25, 0x6c, 0x25, 0x88, 0x25, 0x93, 0x25, 0xca, 0xe0, 0xff, 0xef, 0xfd, 0xf0, 0x02, 0xf5, 0x11, + 0xf8, 0x1d, 0xfb, 0x02, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d, + 0x00, 0x1d, 0x00, 0x20, 0x00, 0xa0, 0x01, 0x32, 0x01, 0x38, 0x01, 0x49, 0x01, 0x52, 0x01, 0x54, + 0x01, 0x60, 0x01, 0x62, 0x01, 0x78, 0x01, 0x80, 0x01, 0x92, 0x01, 0x93, 0x02, 0x18, 0x02, 0x1c, + 0x02, 0x37, 0x02, 0x38, 0x02, 0x92, 0x02, 0xbc, 0x02, 0xc6, 0x02, 0xc9, 0x02, 0xd8, 0x03, 0x11, + 0x03, 0x84, 0x03, 0x88, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0x91, 0x03, 0xa3, 0x03, 0xaa, 0x03, 0xb1, + 0x03, 0xca, 0x04, 0x00, 0x04, 0x62, 0x04, 0x72, 0x04, 0x8a, 0x1e, 0x80, 0x1e, 0xf2, 0x1f, 0x00, + 0x1f, 0x18, 0x1f, 0x20, 0x1f, 0x48, 0x1f, 0x50, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x5f, + 0x1f, 0x80, 0x1f, 0xb6, 0x1f, 0xc6, 0x1f, 0xd6, 0x1f, 0xdd, 0x1f, 0xf2, 0x1f, 0xf6, 0x20, 0x13, + 0x20, 0x18, 0x20, 0x1c, 0x20, 0x20, 0x20, 0x26, 0x20, 0x30, 0x20, 0x39, 0x20, 0x44, 0x20, 0x70, + 0x20, 0x74, 0x20, 0x80, 0x20, 0xac, 0x20, 0xae, 0x20, 0xb4, 0x20, 0xb9, 0x21, 0x13, 0x21, 0x16, + 0x21, 0x22, 0x21, 0x26, 0x21, 0x2e, 0x21, 0x53, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x11, + 0x22, 0x15, 0x22, 0x19, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x25, 0x00, + 0x25, 0x02, 0x25, 0x0c, 0x25, 0x10, 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, 0x25, 0x2c, + 0x25, 0x34, 0x25, 0x3c, 0x25, 0x50, 0x25, 0x88, 0x25, 0x91, 0x25, 0xca, 0xe0, 0xff, 0xef, 0xfd, + 0xf0, 0x00, 0xf5, 0x06, 0xf8, 0x0a, 0xfb, 0x01, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x01, 0xff, 0xf9, + 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xdb, 0xff, 0xdc, 0xff, 0xdd, 0xff, 0xde, 0x00, 0x00, + 0xff, 0xdc, 0x00, 0x00, 0xff, 0xda, 0x00, 0x00, 0x00, 0x59, 0xfe, 0xd2, 0x00, 0x58, 0xff, 0x41, + 0x00, 0x54, 0xff, 0x26, 0x00, 0x53, 0x00, 0x11, 0xfe, 0xa2, 0x00, 0x00, 0xfe, 0x97, 0x00, 0x00, + 0xff, 0x93, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0xfe, 0xb3, 0xfe, 0xb2, 0xfe, 0xa4, 0xfe, 0x90, 0xe2, 0xe6, 0xe2, 0x7a, + 0xe4, 0xd9, 0xe4, 0xd7, 0xe4, 0xd5, 0xe4, 0xd3, 0xe4, 0xd1, 0xe4, 0xd0, 0xe4, 0xcf, 0xe4, 0xce, + 0xe4, 0xcd, 0xe4, 0xcb, 0xe4, 0xca, 0xe4, 0xc9, 0xe4, 0xc7, 0xe4, 0xc6, 0xe4, 0xc4, 0xe4, 0xc3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x40, 0xe0, 0x3a, 0x00, 0x00, 0xe1, 0x2a, + 0xe0, 0xff, 0xe0, 0xfc, 0xe0, 0xf6, 0xdf, 0xb6, 0xe2, 0xdf, 0xe2, 0xd8, 0xe4, 0x24, 0xe0, 0x6d, + 0xe2, 0x74, 0xdf, 0x54, 0xe0, 0x78, 0xe0, 0x53, 0x00, 0x00, 0xdf, 0x98, 0xdf, 0x95, 0xdf, 0x8d, + 0x00, 0x00, 0xdf, 0x8b, 0xdf, 0x88, 0xdf, 0x85, 0xdf, 0x79, 0xdf, 0x5d, 0xdf, 0x46, 0xdf, 0x43, + 0xdf, 0xe6, 0xdf, 0xe3, 0xdf, 0xd8, 0xdf, 0xde, 0xdf, 0xcf, 0xdf, 0xca, 0xdf, 0xce, 0xdf, 0xc3, + 0xdf, 0xbc, 0xdf, 0xb5, 0xdf, 0xaf, 0x00, 0x00, 0xdf, 0x82, 0xdf, 0x7a, 0xdb, 0xdf, 0x23, 0xdf, + 0x14, 0xe4, 0x00, 0x00, 0x0c, 0x88, 0x09, 0xa4, 0x00, 0x00, 0x04, 0xe3, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, + 0x00, 0xcc, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd4, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xba, 0x00, 0xbe, 0x00, 0xc2, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x79, 0x00, 0x6b, 0x00, 0x77, 0x00, 0x7a, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, + 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x00, 0x69, 0x01, 0x5f, 0x01, 0x61, 0x01, 0x62, + 0x01, 0x63, 0x01, 0x64, 0x00, 0x75, 0x01, 0x65, 0x03, 0xd6, 0x03, 0xd8, 0x03, 0xc2, 0x03, 0xc8, + 0x03, 0xca, 0x03, 0xd0, 0x03, 0xc6, 0x03, 0xc9, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, + 0x03, 0xd4, 0x03, 0xcf, 0x03, 0xd2, 0x03, 0xd1, 0x03, 0xd3, 0x03, 0xd5, 0x00, 0x73, 0x00, 0x74, + 0x03, 0x8b, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x70, 0x00, 0x71, 0x00, 0x65, 0x00, 0x67, + 0x00, 0x68, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x78, 0x01, 0x82, 0x01, 0x83, 0x01, 0x88, 0x01, 0x89, + 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, + 0x01, 0x9d, 0x01, 0x9f, 0x05, 0x01, 0x04, 0xf7, 0x04, 0xf6, 0x05, 0x09, 0x05, 0x00, 0x04, 0xf5, + 0x05, 0x08, 0x04, 0xff, 0x04, 0xf3, 0x05, 0x06, 0x04, 0xfd, 0x04, 0xf2, 0x05, 0x05, 0x04, 0xfc, + 0x04, 0xf0, 0x05, 0x03, 0x04, 0xfa, 0x04, 0xef, 0x05, 0x02, 0x04, 0xf9, 0x04, 0xf4, 0x05, 0x07, + 0x04, 0xfe, 0x04, 0xf1, 0x05, 0x04, 0x04, 0xfb, 0x05, 0x0f, 0x05, 0x0e, 0x04, 0xf8, 0x04, 0xdf, + 0x01, 0xaa, 0x01, 0xac, 0x01, 0xab, 0x01, 0xad, 0x00, 0x06, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, + 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, + 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, + 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, + 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, + 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, + 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, + 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, + 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, + 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, + 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, + 0x00, 0x00, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa2, 0x00, 0xa4, 0x00, 0xac, 0x00, 0xb1, 0x00, 0xb7, + 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbf, 0x00, 0xbe, 0x00, 0xc0, 0x00, 0xc2, 0x00, 0xc4, + 0x00, 0xc3, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc8, 0x00, 0xc7, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcc, + 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xd1, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xd4, 0x00, 0xd6, + 0x00, 0xd7, 0x00, 0x67, 0x00, 0x8b, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x82, 0x00, 0x72, 0x00, 0x91, + 0x00, 0xba, 0x00, 0x89, 0x00, 0x84, 0x00, 0x76, 0x00, 0x8f, 0x00, 0x83, 0x01, 0xa6, 0x00, 0xa1, + 0x00, 0xb3, 0x01, 0xa3, 0x00, 0x8c, 0x01, 0xa7, 0x01, 0xa8, 0x00, 0x80, 0x00, 0x90, 0x01, 0x9a, + 0x01, 0x9d, 0x01, 0x9c, 0x03, 0xb8, 0x01, 0xa4, 0x00, 0x85, 0x00, 0x95, 0x01, 0x9e, 0x00, 0xc1, + 0x00, 0xd3, 0x00, 0x9a, 0x00, 0x7c, 0x00, 0x87, 0x01, 0xa2, 0x00, 0x64, 0x01, 0xa5, 0x01, 0x9b, + 0x00, 0x86, 0x00, 0x96, 0x00, 0x66, 0x00, 0x7b, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0xb0, 0x00, 0x6d, + 0x00, 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x70, 0x00, 0x71, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0xd2, + 0x01, 0xa9, 0x00, 0xda, 0x00, 0x7a, 0x01, 0x6e, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x78, 0x01, 0xab, + 0x01, 0xad, 0x00, 0x68, 0x00, 0x92, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x9d, 0x00, 0xa5, + 0x00, 0x9c, 0x00, 0xa6, 0x00, 0xa3, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xa7, 0x00, 0xae, + 0x00, 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb4, 0x01, 0x0c, 0x00, 0x69, + 0x00, 0x75, 0x00, 0x8a, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x00, 0x93, 0x01, 0x65, 0x01, 0x64, + 0x01, 0x5f, 0x00, 0x00, 0x40, 0x3f, 0x58, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0x4e, 0x4d, + 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, + 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x2f, 0x2e, 0x2d, 0x2c, 0x28, 0x26, 0x25, 0x24, + 0x23, 0x22, 0x1f, 0x18, 0x14, 0x11, 0x10, 0x0f, 0x0d, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x01, 0x00, 0x2c, 0x45, 0x23, 0x46, 0x60, 0x20, 0xb0, 0x26, 0x60, 0xb0, 0x04, + 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0x20, 0xb0, 0x26, 0x61, 0xb0, + 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0, 0x20, 0x61, 0x20, 0xb0, + 0x46, 0x60, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0xb0, + 0x20, 0x60, 0x20, 0xb0, 0x26, 0x61, 0xb0, 0x20, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, + 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0, 0x40, 0x61, 0x20, 0xb0, 0x66, 0x60, 0xb0, 0x04, 0x26, 0x23, + 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0xb0, 0x40, 0x60, 0x20, 0xb0, 0x26, 0x61, + 0xb0, 0x40, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x01, 0x10, 0x20, 0x3c, 0x00, + 0x3c, 0x2d, 0x2c, 0x20, 0x45, 0x23, 0x20, 0xb0, 0xcd, 0x44, 0x23, 0x20, 0xb8, 0x01, 0x5a, 0x51, + 0x58, 0x23, 0x20, 0xb0, 0x8d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0xed, 0x51, 0x58, 0x23, 0x20, 0xb0, + 0x4d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0x04, 0x26, 0x51, 0x58, 0x23, 0x20, 0xb0, 0x0d, 0x44, 0x23, + 0x59, 0x21, 0x21, 0x2d, 0x2c, 0x20, 0x20, 0x45, 0x18, 0x68, 0x44, 0x20, 0xb0, 0x01, 0x60, 0x20, + 0x45, 0xb0, 0x46, 0x76, 0x68, 0x8a, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x01, 0xb1, 0x0b, 0x0a, 0x43, + 0x23, 0x43, 0x65, 0x0a, 0x2d, 0x2c, 0x00, 0xb1, 0x0a, 0x0b, 0x43, 0x23, 0x43, 0x0b, 0x2d, 0x2c, + 0x00, 0xb0, 0x28, 0x23, 0x70, 0xb1, 0x01, 0x28, 0x3e, 0x01, 0xb0, 0x28, 0x23, 0x70, 0xb1, 0x02, + 0x28, 0x45, 0x3a, 0xb1, 0x02, 0x00, 0x08, 0x0d, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x03, 0x25, 0x45, + 0x61, 0x64, 0xb0, 0x50, 0x51, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x20, 0x45, + 0xb0, 0x00, 0x43, 0x60, 0x44, 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x43, 0xb0, 0x07, 0x43, 0x65, 0x0a, + 0x2d, 0x2c, 0x20, 0x69, 0xb0, 0x40, 0x61, 0xb0, 0x00, 0x8b, 0x20, 0xb1, 0x2c, 0xc0, 0x8a, 0x8c, + 0xb8, 0x10, 0x00, 0x62, 0x60, 0x2b, 0x0c, 0x64, 0x23, 0x64, 0x61, 0x5c, 0x58, 0xb0, 0x03, 0x61, + 0x59, 0x2d, 0x2c, 0x8a, 0x03, 0x45, 0x8a, 0x8a, 0x87, 0xb0, 0x11, 0x2b, 0xb0, 0x29, 0x23, 0x44, + 0xb0, 0x29, 0x7a, 0xe4, 0x18, 0x2d, 0x2c, 0x45, 0x65, 0xb0, 0x2c, 0x23, 0x44, 0x45, 0xb0, 0x2b, + 0x23, 0x44, 0x2d, 0x2c, 0x4b, 0x52, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x01, + 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x60, 0x23, 0xed, 0xec, 0x2d, + 0x2c, 0x01, 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x61, 0x23, 0xed, + 0xec, 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x25, 0x10, 0xf5, 0x00, 0xed, 0xec, 0x2d, 0x2c, 0x20, 0xb0, + 0x01, 0x60, 0x01, 0x10, 0x20, 0x3c, 0x00, 0x3c, 0x2d, 0x2c, 0x20, 0xb0, 0x01, 0x61, 0x01, 0x10, + 0x20, 0x3c, 0x00, 0x3c, 0x2d, 0x2c, 0x00, 0xb0, 0x07, 0x43, 0xb0, 0x06, 0x43, 0x0b, 0x2d, 0x2c, + 0x21, 0x21, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x2d, 0x2c, 0x21, 0xb0, 0x80, + 0x51, 0x58, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x20, 0x00, 0x62, 0x1b, 0xb2, 0x00, 0x40, 0x2f, + 0x2b, 0x59, 0xb0, 0x02, 0x60, 0x2d, 0x2c, 0x21, 0xb0, 0xc0, 0x51, 0x58, 0x0c, 0x64, 0x23, 0x64, + 0x8b, 0xb8, 0x15, 0x55, 0x62, 0x1b, 0xb2, 0x00, 0x80, 0x2f, 0x2b, 0x59, 0xb0, 0x02, 0x60, 0x2d, + 0x2c, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x60, 0x23, 0x21, 0x2d, 0x2c, 0x45, + 0x23, 0x45, 0x60, 0x23, 0x45, 0x60, 0x23, 0x45, 0x60, 0x23, 0x76, 0x68, 0x18, 0xb0, 0x80, 0x62, + 0x20, 0x2d, 0x2c, 0xb0, 0x04, 0x26, 0xb0, 0x04, 0x26, 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x45, + 0x23, 0x45, 0x20, 0xb0, 0x03, 0x26, 0x60, 0x62, 0x63, 0x68, 0x20, 0xb0, 0x03, 0x26, 0x61, 0x65, + 0x8a, 0x23, 0x44, 0x44, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x00, 0x54, 0x58, 0xb0, 0x40, 0x44, 0x20, + 0x45, 0xb0, 0x40, 0x61, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x45, 0xb1, 0x30, 0x2f, 0x45, + 0x23, 0x45, 0x61, 0x60, 0xb0, 0x01, 0x60, 0x69, 0x44, 0x2d, 0x2c, 0x4b, 0x51, 0x58, 0xb0, 0x2f, + 0x23, 0x70, 0xb0, 0x14, 0x23, 0x42, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x51, 0x58, 0x20, + 0xb0, 0x03, 0x25, 0x45, 0x69, 0x53, 0x58, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x1b, 0x21, 0x21, 0x59, + 0x2d, 0x2c, 0x45, 0xb0, 0x14, 0x43, 0xb0, 0x00, 0x60, 0x63, 0xb0, 0x01, 0x60, 0x69, 0x44, 0x2d, + 0x2c, 0xb0, 0x2f, 0x45, 0x44, 0x2d, 0x2c, 0x45, 0x23, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x2d, 0x2c, + 0x45, 0x23, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x4b, 0x23, 0x51, 0x58, 0xb9, 0x00, 0x33, 0xff, 0xe0, + 0xb1, 0x34, 0x20, 0x1b, 0xb3, 0x33, 0x00, 0x34, 0x00, 0x59, 0x44, 0x44, 0x2d, 0x2c, 0xb0, 0x16, + 0x43, 0x58, 0xb0, 0x03, 0x26, 0x45, 0x8a, 0x58, 0x64, 0x66, 0xb0, 0x1f, 0x60, 0x1b, 0x64, 0xb0, + 0x20, 0x60, 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x59, 0x23, 0x58, + 0x65, 0x59, 0xb0, 0x29, 0x23, 0x44, 0x23, 0x10, 0xb0, 0x29, 0xe0, 0x1b, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x16, 0x43, 0x58, 0xb0, 0x04, 0x25, 0x45, 0x64, 0xb0, 0x20, 0x60, + 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x23, 0x58, 0x65, 0x59, 0xb0, + 0x29, 0x23, 0x44, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0x20, 0x58, 0x02, 0x1b, 0x03, 0x59, + 0xb0, 0x05, 0x25, 0x10, 0xb0, 0x04, 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, 0x23, 0x42, 0x3c, 0xb0, + 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, 0xb0, 0x01, 0x60, 0x23, 0x42, + 0x3c, 0x20, 0x58, 0x01, 0x1b, 0x00, 0x59, 0xb0, 0x05, 0x25, 0x10, 0xb0, 0x04, 0x25, 0xb0, 0x29, + 0xe0, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0xb0, 0x29, 0xe0, 0xb0, 0x04, 0x25, 0xb0, 0x07, + 0x25, 0x08, 0x20, 0x58, 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x04, 0x25, 0xb0, 0x03, 0x25, 0x43, 0x48, + 0xb0, 0x06, 0x25, 0xb0, 0x03, 0x25, 0xb0, 0x01, 0x60, 0x43, 0x48, 0x1b, 0x21, 0x59, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0xb0, 0x16, 0x43, 0x58, 0xb0, 0x04, 0x25, 0x45, 0x64, + 0xb0, 0x20, 0x60, 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x23, 0x58, + 0x1b, 0x65, 0x59, 0xb0, 0x29, 0x23, 0x44, 0xb0, 0x05, 0x25, 0xb0, 0x08, 0x25, 0x08, 0x20, 0x58, + 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x04, 0x25, 0x10, 0xb0, 0x05, 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, + 0x23, 0x42, 0x3c, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, + 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, 0xb0, 0x01, 0x60, 0x23, 0x42, 0x3c, 0x20, 0x58, 0x01, 0x1b, + 0x00, 0x59, 0xb0, 0x04, 0x25, 0x10, 0xb0, 0x05, 0x25, 0xb0, 0x29, 0xe0, 0xb0, 0x29, 0x20, 0x45, + 0x65, 0x44, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0xb0, 0x29, 0xe0, 0xb0, 0x05, 0x25, 0xb0, + 0x08, 0x25, 0x08, 0x20, 0x58, 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x05, 0x25, 0xb0, 0x03, 0x25, 0x43, + 0x48, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0xb0, 0x06, 0x25, 0xb0, 0x03, 0x25, 0xb0, 0x01, + 0x60, 0x43, 0x48, 0x1b, 0x21, 0x59, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x02, + 0xb0, 0x04, 0x25, 0x20, 0x20, 0x46, 0xb0, 0x04, 0x25, 0x23, 0x42, 0xb0, 0x05, 0x25, 0x08, 0xb0, + 0x03, 0x25, 0x45, 0x48, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x02, 0xb0, 0x03, 0x25, 0x20, 0xb0, + 0x04, 0x25, 0x08, 0xb0, 0x02, 0x25, 0x43, 0x48, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x45, 0x23, 0x20, + 0x45, 0x18, 0x20, 0xb0, 0x00, 0x50, 0x20, 0x58, 0x23, 0x65, 0x23, 0x59, 0x23, 0x68, 0x20, 0xb0, + 0x40, 0x50, 0x58, 0x21, 0xb0, 0x40, 0x59, 0x23, 0x58, 0x65, 0x59, 0x8a, 0x60, 0x44, 0x2d, 0x2c, + 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, + 0x2d, 0x2c, 0x4b, 0x54, 0x58, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, + 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x54, + 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x46, 0x2b, + 0x1b, 0x21, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x47, 0x2b, + 0x1b, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x48, 0x2b, 0x1b, + 0x21, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x49, 0x2b, 0x1b, + 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x20, 0x8a, 0x08, 0x23, 0x4b, 0x53, 0x8a, 0x4b, 0x51, 0x5a, + 0x58, 0x23, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x00, 0x20, 0x8a, 0x49, 0xb0, 0x00, 0x51, + 0x58, 0xb0, 0x40, 0x23, 0x20, 0x8a, 0x38, 0x12, 0x34, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x01, + 0x46, 0x23, 0x46, 0x60, 0x23, 0x46, 0x61, 0x23, 0x20, 0x10, 0x20, 0x46, 0x8a, 0x61, 0xb8, 0xff, + 0x80, 0x62, 0x8a, 0xb1, 0x40, 0x40, 0x8a, 0x70, 0x45, 0x60, 0x68, 0x3a, 0x2d, 0x2c, 0x20, 0x8a, + 0x23, 0x49, 0x64, 0x8a, 0x23, 0x53, 0x58, 0x3c, 0x1b, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x52, 0x58, + 0x7d, 0x1b, 0x7a, 0x59, 0x2d, 0x2c, 0xb0, 0x12, 0x00, 0x4b, 0x01, 0x4b, 0x54, 0x42, 0x2d, 0x2c, + 0xb1, 0x02, 0x00, 0x42, 0xb1, 0x23, 0x01, 0x88, 0x51, 0xb1, 0x40, 0x01, 0x88, 0x53, 0x5a, 0x58, + 0xb9, 0x10, 0x00, 0x00, 0x20, 0x88, 0x54, 0x58, 0xb1, 0x02, 0x01, 0x42, 0x59, 0x59, 0x2d, 0x2c, + 0x45, 0x18, 0x68, 0x23, 0x4b, 0x51, 0x58, 0x23, 0x20, 0x45, 0x20, 0x64, 0xb0, 0x40, 0x50, 0x58, + 0x7c, 0x59, 0x68, 0x8a, 0x60, 0x59, 0x44, 0x2d, 0x2c, 0xb0, 0x00, 0x16, 0xb0, 0x02, 0x25, 0xb0, + 0x02, 0x25, 0x01, 0xb0, 0x01, 0x23, 0x3e, 0x00, 0xb0, 0x02, 0x23, 0x3e, 0xb1, 0x01, 0x02, 0x06, + 0x0c, 0xb0, 0x0a, 0x23, 0x65, 0x42, 0xb0, 0x0b, 0x23, 0x42, 0x01, 0xb0, 0x01, 0x23, 0x3f, 0x00, + 0xb0, 0x02, 0x23, 0x3f, 0xb1, 0x01, 0x02, 0x06, 0x0c, 0xb0, 0x06, 0x23, 0x65, 0x42, 0xb0, 0x07, + 0x23, 0x42, 0xb0, 0x01, 0x16, 0x01, 0x2d, 0x00, 0x40, 0xa0, 0x76, 0x6e, 0x29, 0x1f, 0x75, 0x6f, + 0x64, 0x1f, 0x74, 0x72, 0x64, 0x1f, 0x72, 0x43, 0x29, 0x1f, 0x71, 0x6f, 0x64, 0x1f, 0x70, 0x6e, + 0x64, 0x1f, 0x6f, 0x42, 0x1b, 0x1f, 0x6e, 0x42, 0x1b, 0x1f, 0x69, 0x61, 0x29, 0x1f, 0x67, 0x65, + 0x64, 0x1f, 0x65, 0x43, 0x29, 0x1f, 0x64, 0x42, 0x0e, 0x1f, 0x63, 0x61, 0x64, 0x1f, 0x61, 0x42, + 0x1b, 0x1f, 0x59, 0x51, 0x29, 0x1f, 0x58, 0x42, 0x15, 0x1f, 0x57, 0x55, 0x64, 0x1f, 0x55, 0x43, + 0x29, 0x1f, 0x54, 0x42, 0x15, 0x1f, 0x53, 0x51, 0x64, 0x1f, 0x52, 0x42, 0x1b, 0x1f, 0x51, 0x42, + 0x1b, 0x1f, 0x4c, 0x44, 0x29, 0x1f, 0x4a, 0x48, 0x64, 0x1f, 0x48, 0x43, 0x29, 0x1f, 0x46, 0x44, + 0x64, 0x1f, 0x44, 0x42, 0x1b, 0x1f, 0x43, 0x41, 0x11, 0x1f, 0x2f, 0x42, 0x3f, 0x42, 0x02, 0x9d, + 0x9c, 0x2a, 0x1f, 0x0d, 0x2a, 0x0c, 0x55, 0x05, 0x2a, 0x04, 0x55, 0x00, 0x9c, 0x10, 0x9c, 0x02, + 0x0f, 0x2a, 0x0e, 0x55, 0x0b, 0x2a, 0x0a, 0x55, 0x07, 0x2a, 0x06, 0x55, 0x01, 0x2a, 0x00, 0x55, + 0x09, 0x2a, 0x08, 0x55, 0x03, 0x2a, 0x02, 0x55, 0x54, 0x53, 0xb8, 0x01, 0x00, 0xb3, 0x16, 0x01, + 0x05, 0x01, 0xb8, 0x01, 0x90, 0x4b, 0xb8, 0x08, 0x00, 0x52, 0x4b, 0xb0, 0x08, 0x50, 0x5b, 0xb0, + 0x01, 0x88, 0xb0, 0x25, 0x53, 0xb0, 0x01, 0x88, 0xb0, 0x40, 0x51, 0x5a, 0xb0, 0x06, 0x88, 0xb0, + 0x00, 0x55, 0x5a, 0x5b, 0x58, 0xb1, 0x01, 0x01, 0x8e, 0x59, 0x85, 0x8d, 0x8d, 0x00, 0x42, 0x1d, + 0x4b, 0xb0, 0x1d, 0x53, 0x58, 0xb0, 0xa0, 0x1d, 0x59, 0x4b, 0xb0, 0x80, 0x53, 0x58, 0xb0, 0x00, + 0x1d, 0xb1, 0x16, 0x00, 0x42, 0x59, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x74, + 0x2b, 0x2b, 0x2b, 0x01, 0x73, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x18, 0x00, 0x02, 0xb0, 0x00, 0x05, + 0x02, 0x6b, 0x00, 0x0e, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x00, 0xff, 0xf5, 0x00, 0x00, 0xff, 0xf3, + 0x01, 0xd6, 0x00, 0x0c, 0x00, 0x00, 0xff, 0xf3, 0xff, 0x5b, 0xff, 0xfd, 0x02, 0xbb, 0x00, 0x00, + 0xff, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x50, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x66, 0x00, 0x50, + 0x00, 0x6b, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, + 0x00, 0x64, 0x00, 0x7d, 0x00, 0x9b, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x9b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, + 0x00, 0x00, 0x00, 0x7d, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x8e, 0x00, 0x7d, 0x00, 0xa6, + 0x00, 0x66, 0x00, 0x54, 0x00, 0x6b, 0x00, 0xa6, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x50, 0x00, 0x50, 0x02, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3a, + 0x00, 0x3a, 0x01, 0x64, 0x00, 0x64, 0x00, 0x5f, 0x03, 0x40, 0xff, 0x9f, 0xff, 0x7e, 0x00, 0x00, + 0x02, 0xc6, 0x02, 0x72, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x55, 0x00, 0x2a, 0xff, 0xd8, + 0xff, 0x57, 0x02, 0x87, 0xff, 0x21, 0x00, 0x8c, 0x00, 0x8c, 0x02, 0x87, 0x02, 0xa3, 0x00, 0x47, + 0x01, 0x03, 0x01, 0x03, 0x01, 0x78, 0x01, 0x6f, 0x02, 0x7b, 0x02, 0xb5, 0x02, 0xaa, 0x01, 0x39, + 0x01, 0x6a, 0x01, 0x95, 0x00, 0x5a, 0x00, 0x5c, 0x02, 0xb6, 0x02, 0x12, 0x02, 0x2e, 0x00, 0x72, + 0xff, 0xd3, 0x02, 0xbe, 0x02, 0x2b, 0x00, 0x7a, 0x02, 0x34, 0x00, 0x59, 0x03, 0x2a, 0x02, 0x43, + 0x00, 0x72, 0x00, 0x72, 0x02, 0x51, 0x00, 0x59, 0xff, 0xa7, 0x03, 0x12, 0x02, 0xf4, 0x00, 0xdd, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, + 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x01, 0x58, + 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x05, 0x84, 0x00, 0x00, 0x07, 0x0c, + 0x00, 0x00, 0x07, 0x7c, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x08, 0x24, 0x00, 0x00, 0x09, 0x38, + 0x00, 0x00, 0x09, 0xf0, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x7c, 0x00, 0x00, 0x0b, 0x14, + 0x00, 0x00, 0x0b, 0x5c, 0x00, 0x00, 0x0c, 0x1c, 0x00, 0x00, 0x0c, 0x88, 0x00, 0x00, 0x0d, 0x20, + 0x00, 0x00, 0x0e, 0x2c, 0x00, 0x00, 0x0e, 0xa8, 0x00, 0x00, 0x0f, 0x54, 0x00, 0x00, 0x10, 0x18, + 0x00, 0x00, 0x10, 0x78, 0x00, 0x00, 0x12, 0x1c, 0x00, 0x00, 0x12, 0xdc, 0x00, 0x00, 0x13, 0x08, + 0x00, 0x00, 0x13, 0x20, 0x00, 0x00, 0x13, 0x74, 0x00, 0x00, 0x13, 0xbc, 0x00, 0x00, 0x14, 0x14, + 0x00, 0x00, 0x14, 0xd0, 0x00, 0x00, 0x16, 0xe8, 0x00, 0x00, 0x17, 0x7c, 0x00, 0x00, 0x18, 0x60, + 0x00, 0x00, 0x18, 0xfc, 0x00, 0x00, 0x19, 0x9c, 0x00, 0x00, 0x1a, 0x18, 0x00, 0x00, 0x1a, 0x88, + 0x00, 0x00, 0x1b, 0x28, 0x00, 0x00, 0x1b, 0x90, 0x00, 0x00, 0x1b, 0xe8, 0x00, 0x00, 0x1c, 0x58, + 0x00, 0x00, 0x1c, 0xdc, 0x00, 0x00, 0x1d, 0x28, 0x00, 0x00, 0x1e, 0xf8, 0x00, 0x00, 0x1f, 0x84, + 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, 0xa0, 0x00, 0x00, 0x21, 0x48, 0x00, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x22, 0xf0, 0x00, 0x00, 0x23, 0x34, 0x00, 0x00, 0x23, 0xb4, 0x00, 0x00, 0x24, 0x80, + 0x00, 0x00, 0x26, 0x6c, 0x00, 0x00, 0x27, 0x24, 0x00, 0x00, 0x27, 0xa8, 0x00, 0x00, 0x28, 0x4c, + 0x00, 0x00, 0x28, 0xa0, 0x00, 0x00, 0x28, 0xe8, 0x00, 0x00, 0x29, 0x3c, 0x00, 0x00, 0x29, 0x8c, + 0x00, 0x00, 0x29, 0xbc, 0x00, 0x00, 0x29, 0xe8, 0x00, 0x00, 0x2a, 0xc4, 0x00, 0x00, 0x2b, 0x84, + 0x00, 0x00, 0x2c, 0x1c, 0x00, 0x00, 0x2c, 0xd8, 0x00, 0x00, 0x2d, 0xa8, 0x00, 0x00, 0x2e, 0x50, + 0x00, 0x00, 0x2f, 0x10, 0x00, 0x00, 0x2f, 0x98, 0x00, 0x00, 0x30, 0x48, 0x00, 0x00, 0x30, 0xf8, + 0x00, 0x00, 0x31, 0xa0, 0x00, 0x00, 0x32, 0x18, 0x00, 0x00, 0x33, 0x14, 0x00, 0x00, 0x33, 0x84, + 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x34, 0xa0, 0x00, 0x00, 0x35, 0x3c, 0x00, 0x00, 0x35, 0xa4, + 0x00, 0x00, 0x36, 0x80, 0x00, 0x00, 0x37, 0x40, 0x00, 0x00, 0x37, 0xb0, 0x00, 0x00, 0x38, 0x40, + 0x00, 0x00, 0x39, 0xfc, 0x00, 0x00, 0x3a, 0x74, 0x00, 0x00, 0x3b, 0x10, 0x00, 0x00, 0x3b, 0xa4, + 0x00, 0x00, 0x3c, 0x40, 0x00, 0x00, 0x3c, 0x84, 0x00, 0x00, 0x3d, 0x38, 0x00, 0x00, 0x3d, 0xb8, + 0x00, 0x00, 0x3e, 0xb8, 0x00, 0x00, 0x3f, 0x14, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x40, 0x58, + 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x41, 0x80, 0x00, 0x00, 0x42, 0x34, 0x00, 0x00, 0x42, 0x98, + 0x00, 0x00, 0x44, 0x88, 0x00, 0x00, 0x44, 0xb4, 0x00, 0x00, 0x45, 0x10, 0x00, 0x00, 0x45, 0xec, + 0x00, 0x00, 0x46, 0x48, 0x00, 0x00, 0x46, 0xac, 0x00, 0x00, 0x47, 0x4c, 0x00, 0x00, 0x47, 0xf4, + 0x00, 0x00, 0x48, 0x4c, 0x00, 0x00, 0x48, 0x78, 0x00, 0x00, 0x48, 0xa4, 0x00, 0x00, 0x49, 0x98, + 0x00, 0x00, 0x4a, 0x94, 0x00, 0x00, 0x4a, 0xbc, 0x00, 0x00, 0x4b, 0x3c, 0x00, 0x00, 0x4c, 0x5c, + 0x00, 0x00, 0x4c, 0x90, 0x00, 0x00, 0x4c, 0x90, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, 0x4d, 0xc8, + 0x00, 0x00, 0x4e, 0x8c, 0x00, 0x00, 0x4f, 0xe8, 0x00, 0x00, 0x50, 0xcc, 0x00, 0x00, 0x51, 0x14, + 0x00, 0x00, 0x52, 0x5c, 0x00, 0x00, 0x52, 0xc8, 0x00, 0x00, 0x54, 0x14, 0x00, 0x00, 0x55, 0x04, + 0x00, 0x00, 0x55, 0x98, 0x00, 0x00, 0x55, 0xd0, 0x00, 0x00, 0x55, 0xe0, 0x00, 0x00, 0x57, 0x9c, + 0x00, 0x00, 0x57, 0xc8, 0x00, 0x00, 0x58, 0x3c, 0x00, 0x00, 0x58, 0xf0, 0x00, 0x00, 0x59, 0x84, + 0x00, 0x00, 0x5a, 0xe0, 0x00, 0x00, 0x5b, 0x0c, 0x00, 0x00, 0x5b, 0x94, 0x00, 0x00, 0x5c, 0x18, + 0x00, 0x00, 0x5c, 0x2c, 0x00, 0x00, 0x5c, 0x98, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5d, 0xd0, + 0x00, 0x00, 0x5e, 0x40, 0x00, 0x00, 0x5f, 0x88, 0x00, 0x00, 0x60, 0x88, 0x00, 0x00, 0x61, 0xd4, + 0x00, 0x00, 0x62, 0xa8, 0x00, 0x00, 0x62, 0xd8, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, 0x63, 0x30, + 0x00, 0x00, 0x63, 0x5c, 0x00, 0x00, 0x63, 0x90, 0x00, 0x00, 0x64, 0xd8, 0x00, 0x00, 0x65, 0xc0, + 0x00, 0x00, 0x66, 0xac, 0x00, 0x00, 0x66, 0xdc, 0x00, 0x00, 0x67, 0x0c, 0x00, 0x00, 0x67, 0x3c, + 0x00, 0x00, 0x67, 0x70, 0x00, 0x00, 0x67, 0xa0, 0x00, 0x00, 0x67, 0xd0, 0x00, 0x00, 0x67, 0xfc, + 0x00, 0x00, 0x68, 0x30, 0x00, 0x00, 0x68, 0xf4, 0x00, 0x00, 0x69, 0x20, 0x00, 0x00, 0x69, 0x50, + 0x00, 0x00, 0x69, 0x7c, 0x00, 0x00, 0x69, 0xa8, 0x00, 0x00, 0x69, 0xd4, 0x00, 0x00, 0x6a, 0x08, + 0x00, 0x00, 0x6a, 0xb0, 0x00, 0x00, 0x6b, 0xc0, 0x00, 0x00, 0x6b, 0xf0, 0x00, 0x00, 0x6c, 0x1c, + 0x00, 0x00, 0x6c, 0x48, 0x00, 0x00, 0x6c, 0x7c, 0x00, 0x00, 0x6c, 0xa8, 0x00, 0x00, 0x6d, 0x3c, + 0x00, 0x00, 0x6e, 0x54, 0x00, 0x00, 0x6e, 0x7c, 0x00, 0x00, 0x6e, 0xa4, 0x00, 0x00, 0x6e, 0xcc, + 0x00, 0x00, 0x6e, 0xf4, 0x00, 0x00, 0x6f, 0x24, 0x00, 0x00, 0x6f, 0x50, 0x00, 0x00, 0x70, 0xc0, + 0x00, 0x00, 0x71, 0xa8, 0x00, 0x00, 0x71, 0xd4, 0x00, 0x00, 0x71, 0xfc, 0x00, 0x00, 0x72, 0x24, + 0x00, 0x00, 0x72, 0x54, 0x00, 0x00, 0x72, 0x80, 0x00, 0x00, 0x72, 0xac, 0x00, 0x00, 0x72, 0xd8, + 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x74, 0x0c, 0x00, 0x00, 0x74, 0x34, 0x00, 0x00, 0x74, 0x60, + 0x00, 0x00, 0x74, 0x88, 0x00, 0x00, 0x74, 0xb0, 0x00, 0x00, 0x74, 0xd8, 0x00, 0x00, 0x75, 0x08, + 0x00, 0x00, 0x75, 0xc0, 0x00, 0x00, 0x76, 0x90, 0x00, 0x00, 0x76, 0xbc, 0x00, 0x00, 0x76, 0xe4, + 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x77, 0x3c, 0x00, 0x00, 0x77, 0x64, 0x00, 0x00, 0x78, 0x14, + 0x00, 0x00, 0x78, 0x44, 0x00, 0x00, 0x78, 0x70, 0x00, 0x00, 0x78, 0x98, 0x00, 0x00, 0x78, 0xc4, + 0x00, 0x00, 0x78, 0xec, 0x00, 0x00, 0x79, 0xb8, 0x00, 0x00, 0x7a, 0xd0, 0x00, 0x00, 0x7a, 0xfc, + 0x00, 0x00, 0x7b, 0x24, 0x00, 0x00, 0x7b, 0x50, 0x00, 0x00, 0x7b, 0x78, 0x00, 0x00, 0x7b, 0xa4, + 0x00, 0x00, 0x7b, 0xcc, 0x00, 0x00, 0x7b, 0xf8, 0x00, 0x00, 0x7c, 0x20, 0x00, 0x00, 0x7c, 0x50, + 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, 0x7d, 0x14, 0x00, 0x00, 0x7d, 0xc4, 0x00, 0x00, 0x7d, 0xf4, + 0x00, 0x00, 0x7e, 0x1c, 0x00, 0x00, 0x7e, 0x4c, 0x00, 0x00, 0x7e, 0x74, 0x00, 0x00, 0x7e, 0xa4, + 0x00, 0x00, 0x7e, 0xcc, 0x00, 0x00, 0x7f, 0x88, 0x00, 0x00, 0x80, 0xa0, 0x00, 0x00, 0x80, 0xd0, + 0x00, 0x00, 0x80, 0xf8, 0x00, 0x00, 0x81, 0x24, 0x00, 0x00, 0x81, 0x4c, 0x00, 0x00, 0x81, 0x78, + 0x00, 0x00, 0x81, 0xa0, 0x00, 0x00, 0x81, 0xcc, 0x00, 0x00, 0x81, 0xf4, 0x00, 0x00, 0x82, 0x18, + 0x00, 0x00, 0x82, 0x40, 0x00, 0x00, 0x82, 0x6c, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x83, 0xbc, + 0x00, 0x00, 0x84, 0xc4, 0x00, 0x00, 0x84, 0xf0, 0x00, 0x00, 0x85, 0x1c, 0x00, 0x00, 0x85, 0x48, + 0x00, 0x00, 0x85, 0x74, 0x00, 0x00, 0x85, 0xa0, 0x00, 0x00, 0x85, 0xcc, 0x00, 0x00, 0x86, 0x88, + 0x00, 0x00, 0x87, 0x70, 0x00, 0x00, 0x87, 0x9c, 0x00, 0x00, 0x88, 0x18, 0x00, 0x00, 0x88, 0x28, + 0x00, 0x00, 0x88, 0xb8, 0x00, 0x00, 0x89, 0xc4, 0x00, 0x00, 0x89, 0xf0, 0x00, 0x00, 0x8a, 0x18, + 0x00, 0x00, 0x8a, 0x40, 0x00, 0x00, 0x8a, 0x68, 0x00, 0x00, 0x8b, 0x50, 0x00, 0x00, 0x8b, 0xcc, + 0x00, 0x00, 0x8b, 0xfc, 0x00, 0x00, 0x8c, 0x84, 0x00, 0x00, 0x8c, 0xac, 0x00, 0x00, 0x8c, 0xd0, + 0x00, 0x00, 0x8c, 0xf4, 0x00, 0x00, 0x8d, 0x18, 0x00, 0x00, 0x8d, 0xa0, 0x00, 0x00, 0x8e, 0x50, + 0x00, 0x00, 0x8e, 0xc8, 0x00, 0x00, 0x8f, 0x5c, 0x00, 0x00, 0x8f, 0x88, 0x00, 0x00, 0x8f, 0xb0, + 0x00, 0x00, 0x8f, 0xd8, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x90, 0x2c, 0x00, 0x00, 0x90, 0x58, + 0x00, 0x00, 0x91, 0x50, 0x00, 0x00, 0x91, 0x70, 0x00, 0x00, 0x92, 0x10, 0x00, 0x00, 0x92, 0xa0, + 0x00, 0x00, 0x92, 0xcc, 0x00, 0x00, 0x92, 0xf4, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x48, + 0x00, 0x00, 0x93, 0x7c, 0x00, 0x00, 0x93, 0xac, 0x00, 0x00, 0x93, 0xdc, 0x00, 0x00, 0x94, 0x04, + 0x00, 0x00, 0x94, 0x2c, 0x00, 0x00, 0x94, 0x54, 0x00, 0x00, 0x94, 0x84, 0x00, 0x00, 0x94, 0xac, + 0x00, 0x00, 0x94, 0xd8, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x2c, 0x00, 0x00, 0x95, 0x54, + 0x00, 0x00, 0x96, 0x98, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x98, 0xb8, 0x00, 0x00, 0x99, 0xb4, + 0x00, 0x00, 0x99, 0xe0, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x9a, 0x98, 0x00, 0x00, 0x9b, 0x9c, + 0x00, 0x00, 0x9b, 0xc8, 0x00, 0x00, 0x9b, 0xf0, 0x00, 0x00, 0x9c, 0x1c, 0x00, 0x00, 0x9c, 0x44, + 0x00, 0x00, 0x9c, 0x70, 0x00, 0x00, 0x9c, 0x98, 0x00, 0x00, 0x9d, 0x90, 0x00, 0x00, 0x9d, 0xb4, + 0x00, 0x00, 0x9d, 0xe8, 0x00, 0x00, 0x9e, 0x18, 0x00, 0x00, 0x9e, 0xc4, 0x00, 0x00, 0x9f, 0x78, + 0x00, 0x00, 0x9f, 0xa4, 0x00, 0x00, 0x9f, 0xcc, 0x00, 0x00, 0x9f, 0xf8, 0x00, 0x00, 0xa0, 0x20, + 0x00, 0x00, 0xa0, 0x4c, 0x00, 0x00, 0xa0, 0x74, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0xa0, 0xcc, + 0x00, 0x00, 0xa0, 0xf8, 0x00, 0x00, 0xa1, 0x20, 0x00, 0x00, 0xa1, 0x98, 0x00, 0x00, 0xa1, 0xc0, + 0x00, 0x00, 0xa1, 0xe8, 0x00, 0x00, 0xa2, 0x10, 0x00, 0x00, 0xa2, 0x34, 0x00, 0x00, 0xa2, 0x9c, + 0x00, 0x00, 0xa2, 0xe8, 0x00, 0x00, 0xa3, 0x48, 0x00, 0x00, 0xa3, 0x74, 0x00, 0x00, 0xa3, 0xd4, + 0x00, 0x00, 0xa4, 0x14, 0x00, 0x00, 0xa4, 0x98, 0x00, 0x00, 0xa4, 0xf8, 0x00, 0x00, 0xa5, 0x48, + 0x00, 0x00, 0xa5, 0x78, 0x00, 0x00, 0xa5, 0xa4, 0x00, 0x00, 0xa5, 0xd0, 0x00, 0x00, 0xa5, 0xf8, + 0x00, 0x00, 0xa6, 0x2c, 0x00, 0x00, 0xa6, 0x5c, 0x00, 0x00, 0xa6, 0x8c, 0x00, 0x00, 0xa6, 0xb8, + 0x00, 0x00, 0xa6, 0xf0, 0x00, 0x00, 0xa7, 0x8c, 0x00, 0x00, 0xa8, 0x20, 0x00, 0x00, 0xa8, 0xfc, + 0x00, 0x00, 0xa9, 0xd8, 0x00, 0x00, 0xaa, 0x48, 0x00, 0x00, 0xab, 0x90, 0x00, 0x00, 0xac, 0x80, + 0x00, 0x00, 0xac, 0x94, 0x00, 0x00, 0xac, 0xa8, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0xac, 0xd0, + 0x00, 0x00, 0xac, 0xe4, 0x00, 0x00, 0xac, 0xf8, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0xad, 0x20, + 0x00, 0x00, 0xad, 0x34, 0x00, 0x00, 0xad, 0x48, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0xae, 0xf4, + 0x00, 0x00, 0xb0, 0x54, 0x00, 0x00, 0xb1, 0xf8, 0x00, 0x00, 0xb3, 0x78, 0x00, 0x00, 0xb5, 0x60, + 0x00, 0x00, 0xb7, 0xa0, 0x00, 0x00, 0xb9, 0x48, 0x00, 0x00, 0xba, 0x84, 0x00, 0x00, 0xbc, 0x3c, + 0x00, 0x00, 0xbe, 0x14, 0x00, 0x00, 0xbf, 0x74, 0x00, 0x00, 0xc0, 0xac, 0x00, 0x00, 0xc2, 0x60, + 0x00, 0x00, 0xc3, 0x5c, 0x00, 0x00, 0xc4, 0x88, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc7, 0x2c, + 0x00, 0x00, 0xc8, 0x8c, 0x00, 0x00, 0xc9, 0xdc, 0x00, 0x00, 0xcb, 0x40, 0x00, 0x00, 0xcc, 0xc4, + 0x00, 0x00, 0xce, 0x44, 0x00, 0x00, 0xcf, 0xe8, 0x00, 0x00, 0xd1, 0x20, 0x00, 0x00, 0xd3, 0x80, + 0x00, 0x00, 0xd4, 0x60, 0x00, 0x00, 0xd4, 0xe0, 0x00, 0x00, 0xd5, 0x30, 0x00, 0x00, 0xd5, 0xb0, + 0x00, 0x00, 0xd6, 0x98, 0x00, 0x00, 0xd6, 0xc8, 0x00, 0x00, 0xd6, 0xd8, 0x00, 0x00, 0xd7, 0x18, + 0x00, 0x00, 0xd7, 0x94, 0x00, 0x00, 0xd8, 0x74, 0x00, 0x00, 0xd9, 0x18, 0x00, 0x00, 0xd9, 0x30, + 0x00, 0x00, 0xd9, 0xb0, 0x00, 0x00, 0xda, 0x2c, 0x00, 0x00, 0xda, 0xbc, 0x00, 0x00, 0xdb, 0xa4, + 0x00, 0x00, 0xdc, 0x7c, 0x00, 0x00, 0xdc, 0x8c, 0x00, 0x00, 0xdd, 0x7c, 0x00, 0x00, 0xdd, 0x8c, + 0x00, 0x00, 0xdd, 0x9c, 0x00, 0x00, 0xdd, 0xac, 0x00, 0x00, 0xdd, 0xbc, 0x00, 0x00, 0xdd, 0xcc, + 0x00, 0x00, 0xdd, 0xdc, 0x00, 0x00, 0xdd, 0xec, 0x00, 0x00, 0xdd, 0xfc, 0x00, 0x00, 0xde, 0x0c, + 0x00, 0x00, 0xde, 0x1c, 0x00, 0x00, 0xde, 0x2c, 0x00, 0x00, 0xde, 0x40, 0x00, 0x00, 0xde, 0x54, + 0x00, 0x00, 0xde, 0x68, 0x00, 0x00, 0xde, 0x7c, 0x00, 0x00, 0xde, 0x90, 0x00, 0x00, 0xde, 0xa4, + 0x00, 0x00, 0xde, 0xb8, 0x00, 0x00, 0xde, 0xcc, 0x00, 0x00, 0xde, 0xe0, 0x00, 0x00, 0xde, 0xf4, + 0x00, 0x00, 0xdf, 0x20, 0x00, 0x00, 0xdf, 0x68, 0x00, 0x00, 0xdf, 0xa4, 0x00, 0x00, 0xdf, 0xd0, + 0x00, 0x00, 0xdf, 0xe0, 0x00, 0x00, 0xdf, 0xf0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x10, + 0x00, 0x00, 0xe0, 0x20, 0x00, 0x00, 0xe0, 0x30, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0xe0, 0x50, + 0x00, 0x00, 0xe0, 0x60, 0x00, 0x00, 0xe0, 0x70, 0x00, 0x00, 0xe0, 0x80, 0x00, 0x00, 0xe0, 0x90, + 0x00, 0x00, 0xe0, 0xa0, 0x00, 0x00, 0xe0, 0xb0, 0x00, 0x00, 0xe0, 0xc0, 0x00, 0x00, 0xe0, 0xd4, + 0x00, 0x00, 0xe0, 0xe4, 0x00, 0x00, 0xe0, 0xf4, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xe1, 0xe8, + 0x00, 0x00, 0xe2, 0xd4, 0x00, 0x00, 0xe3, 0x8c, 0x00, 0x00, 0xe4, 0x54, 0x00, 0x00, 0xe5, 0x04, + 0x00, 0x00, 0xe5, 0xa4, 0x00, 0x00, 0xe6, 0x34, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe7, 0xac, + 0x00, 0x00, 0xe7, 0xbc, 0x00, 0x00, 0xe8, 0x8c, 0x00, 0x00, 0xe9, 0x28, 0x00, 0x00, 0xe9, 0xbc, + 0x00, 0x00, 0xea, 0xc0, 0x00, 0x00, 0xeb, 0x3c, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xed, 0x14, + 0x00, 0x00, 0xed, 0x8c, 0x00, 0x00, 0xee, 0x50, 0x00, 0x00, 0xef, 0x40, 0x00, 0x00, 0xf0, 0x1c, + 0x00, 0x00, 0xf0, 0xa0, 0x00, 0x00, 0xf1, 0x48, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf2, 0xd0, + 0x00, 0x00, 0xf3, 0x68, 0x00, 0x00, 0xf4, 0x38, 0x00, 0x00, 0xf5, 0x4c, 0x00, 0x00, 0xf5, 0xfc, + 0x00, 0x00, 0xf6, 0x6c, 0x00, 0x00, 0xf7, 0x4c, 0x00, 0x00, 0xf7, 0xf8, 0x00, 0x00, 0xf8, 0xac, + 0x00, 0x00, 0xf9, 0x94, 0x00, 0x00, 0xfa, 0x90, 0x00, 0x00, 0xfb, 0x48, 0x00, 0x00, 0xfb, 0xf8, + 0x00, 0x00, 0xfc, 0xb4, 0x00, 0x00, 0xfd, 0x88, 0x00, 0x00, 0xfe, 0x8c, 0x00, 0x00, 0xfe, 0x9c, + 0x00, 0x00, 0xff, 0x70, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x01, 0x01, 0x58, + 0x00, 0x01, 0x01, 0xd0, 0x00, 0x01, 0x02, 0x6c, 0x00, 0x01, 0x03, 0x04, 0x00, 0x01, 0x03, 0xb4, + 0x00, 0x01, 0x04, 0x64, 0x00, 0x01, 0x05, 0x3c, 0x00, 0x01, 0x06, 0x30, 0x00, 0x01, 0x07, 0x2c, + 0x00, 0x01, 0x08, 0x50, 0x00, 0x01, 0x09, 0x14, 0x00, 0x01, 0x09, 0xf4, 0x00, 0x01, 0x0a, 0xb4, + 0x00, 0x01, 0x0b, 0x8c, 0x00, 0x01, 0x0c, 0x7c, 0x00, 0x01, 0x0d, 0x38, 0x00, 0x01, 0x0d, 0xfc, + 0x00, 0x01, 0x0e, 0xe4, 0x00, 0x01, 0x0f, 0x74, 0x00, 0x01, 0x0f, 0x84, 0x00, 0x01, 0x0f, 0x9c, + 0x00, 0x01, 0x10, 0x3c, 0x00, 0x01, 0x10, 0x4c, 0x00, 0x01, 0x11, 0x80, 0x00, 0x01, 0x12, 0xb8, + 0x00, 0x01, 0x14, 0x08, 0x00, 0x01, 0x14, 0x9c, 0x00, 0x01, 0x15, 0x7c, 0x00, 0x01, 0x16, 0x9c, + 0x00, 0x01, 0x17, 0x48, 0x00, 0x01, 0x18, 0x64, 0x00, 0x01, 0x19, 0xa8, 0x00, 0x01, 0x19, 0xd4, + 0x00, 0x01, 0x19, 0xfc, 0x00, 0x01, 0x1a, 0x28, 0x00, 0x01, 0x1a, 0x54, 0x00, 0x01, 0x1a, 0x80, + 0x00, 0x01, 0x1a, 0xa8, 0x00, 0x01, 0x1a, 0xd4, 0x00, 0x01, 0x1a, 0xfc, 0x00, 0x01, 0x1c, 0x10, + 0x00, 0x01, 0x1c, 0x48, 0x00, 0x01, 0x1d, 0x50, 0x00, 0x01, 0x1d, 0x88, 0x00, 0x01, 0x1e, 0xd8, + 0x00, 0x01, 0x1f, 0x10, 0x00, 0x01, 0x20, 0x48, 0x00, 0x01, 0x20, 0x80, 0x00, 0x01, 0x21, 0x6c, + 0x00, 0x01, 0x23, 0x6c, 0x00, 0x01, 0x23, 0xa4, 0x00, 0x01, 0x24, 0xd0, 0x00, 0x01, 0x25, 0x00, + 0x00, 0x01, 0x25, 0x2c, 0x00, 0x01, 0x25, 0x54, 0x00, 0x01, 0x26, 0x48, 0x00, 0x01, 0x27, 0x58, + 0x00, 0x01, 0x27, 0x84, 0x00, 0x01, 0x27, 0xac, 0x00, 0x01, 0x27, 0xdc, 0x00, 0x01, 0x28, 0xa0, + 0x00, 0x01, 0x29, 0x70, 0x00, 0x01, 0x2a, 0x40, 0x00, 0x01, 0x2a, 0x6c, 0x00, 0x01, 0x2a, 0x94, + 0x00, 0x01, 0x2a, 0xc4, 0x00, 0x01, 0x2a, 0xec, 0x00, 0x01, 0x2b, 0x14, 0x00, 0x01, 0x2c, 0x04, + 0x00, 0x01, 0x2d, 0x10, 0x00, 0x01, 0x2e, 0x0c, 0x00, 0x01, 0x2e, 0x38, 0x00, 0x01, 0x2e, 0x60, + 0x00, 0x01, 0x2f, 0x34, 0x00, 0x01, 0x2f, 0xc0, 0x00, 0x01, 0x2f, 0xf0, 0x00, 0x01, 0x30, 0x1c, + 0x00, 0x01, 0x31, 0x64, 0x00, 0x01, 0x31, 0x8c, 0x00, 0x01, 0x31, 0xb8, 0x00, 0x01, 0x31, 0xe0, + 0x00, 0x01, 0x32, 0x04, 0x00, 0x01, 0x32, 0x30, 0x00, 0x01, 0x32, 0x64, 0x00, 0x01, 0x32, 0x94, + 0x00, 0x01, 0x32, 0xc0, 0x00, 0x01, 0x32, 0xe8, 0x00, 0x01, 0x33, 0x1c, 0x00, 0x01, 0x33, 0x50, + 0x00, 0x01, 0x33, 0x80, 0x00, 0x01, 0x33, 0xa8, 0x00, 0x01, 0x33, 0xdc, 0x00, 0x01, 0x34, 0x10, + 0x00, 0x01, 0x34, 0x3c, 0x00, 0x01, 0x34, 0x68, 0x00, 0x01, 0x34, 0x9c, 0x00, 0x01, 0x34, 0xd0, + 0x00, 0x01, 0x34, 0xfc, 0x00, 0x01, 0x35, 0x24, 0x00, 0x01, 0x35, 0x58, 0x00, 0x01, 0x35, 0x8c, + 0x00, 0x01, 0x35, 0xbc, 0x00, 0x01, 0x35, 0xe4, 0x00, 0x01, 0x36, 0x18, 0x00, 0x01, 0x36, 0x4c, + 0x00, 0x01, 0x36, 0x78, 0x00, 0x01, 0x36, 0xa0, 0x00, 0x01, 0x37, 0x80, 0x00, 0x01, 0x38, 0x44, + 0x00, 0x01, 0x38, 0x70, 0x00, 0x01, 0x39, 0x14, 0x00, 0x01, 0x39, 0x84, 0x00, 0x01, 0x3a, 0x8c, + 0x00, 0x01, 0x3b, 0x9c, 0x00, 0x01, 0x3c, 0xb0, 0x00, 0x01, 0x3d, 0x70, 0x00, 0x01, 0x3e, 0x1c, + 0x00, 0x01, 0x3e, 0x48, 0x00, 0x01, 0x3e, 0x70, 0x00, 0x01, 0x3f, 0x44, 0x00, 0x01, 0x40, 0x40, + 0x00, 0x01, 0x42, 0x10, 0x00, 0x01, 0x42, 0x48, 0x00, 0x01, 0x43, 0xa4, 0x00, 0x01, 0x43, 0xd4, + 0x00, 0x01, 0x44, 0x00, 0x00, 0x01, 0x44, 0x28, 0x00, 0x01, 0x45, 0x4c, 0x00, 0x01, 0x45, 0x7c, + 0x00, 0x01, 0x45, 0xa8, 0x00, 0x01, 0x45, 0xd0, 0x00, 0x01, 0x46, 0x8c, 0x00, 0x01, 0x47, 0xa8, + 0x00, 0x01, 0x48, 0xb4, 0x00, 0x01, 0x49, 0xb8, 0x00, 0x01, 0x4a, 0xb8, 0x00, 0x01, 0x4b, 0x70, + 0x00, 0x01, 0x4c, 0x74, 0x00, 0x01, 0x4d, 0x68, 0x00, 0x01, 0x4d, 0xcc, 0x00, 0x01, 0x4e, 0x50, + 0x00, 0x01, 0x4f, 0x5c, 0x00, 0x01, 0x50, 0x00, 0x00, 0x01, 0x50, 0x8c, 0x00, 0x01, 0x51, 0x20, + 0x00, 0x01, 0x52, 0x38, 0x00, 0x01, 0x53, 0x38, 0x00, 0x01, 0x53, 0x48, 0x00, 0x01, 0x53, 0xf0, + 0x00, 0x01, 0x55, 0x14, 0x00, 0x01, 0x55, 0xa0, 0x00, 0x01, 0x56, 0x88, 0x00, 0x01, 0x57, 0x40, + 0x00, 0x01, 0x57, 0xec, 0x00, 0x01, 0x58, 0xa8, 0x00, 0x01, 0x59, 0x30, 0x00, 0x01, 0x5a, 0x4c, + 0x00, 0x01, 0x5b, 0x64, 0x00, 0x01, 0x5c, 0x10, 0x00, 0x01, 0x5c, 0x6c, 0x00, 0x01, 0x5c, 0xb0, + 0x00, 0x01, 0x5d, 0x4c, 0x00, 0x01, 0x5d, 0xe4, 0x00, 0x01, 0x5e, 0x38, 0x00, 0x01, 0x5e, 0xc0, + 0x00, 0x01, 0x5f, 0x54, 0x00, 0x01, 0x60, 0x00, 0x00, 0x01, 0x60, 0xa0, 0x00, 0x01, 0x60, 0xcc, + 0x00, 0x01, 0x61, 0x04, 0x00, 0x01, 0x61, 0x3c, 0x00, 0x01, 0x61, 0xdc, 0x00, 0x01, 0x62, 0x80, + 0x00, 0x01, 0x63, 0x4c, 0x00, 0x01, 0x63, 0x78, 0x00, 0x01, 0x63, 0xac, 0x00, 0x01, 0x64, 0x70, + 0x00, 0x01, 0x64, 0x9c, 0x00, 0x01, 0x65, 0x38, 0x00, 0x01, 0x65, 0x48, 0x00, 0x01, 0x65, 0x58, + 0x00, 0x01, 0x65, 0x8c, 0x00, 0x01, 0x65, 0x9c, 0x00, 0x01, 0x66, 0x6c, 0x00, 0x01, 0x67, 0x3c, + 0x00, 0x01, 0x67, 0xc4, 0x00, 0x01, 0x67, 0xf4, 0x00, 0x01, 0x68, 0x20, 0x00, 0x01, 0x68, 0x4c, + 0x00, 0x01, 0x68, 0xb8, 0x00, 0x01, 0x68, 0xc8, 0x00, 0x01, 0x69, 0x64, 0x00, 0x01, 0x69, 0x74, + 0x00, 0x01, 0x69, 0xd0, 0x00, 0x01, 0x6a, 0xc4, 0x00, 0x01, 0x6a, 0xd4, 0x00, 0x01, 0x6b, 0xc0, + 0x00, 0x01, 0x6c, 0xf4, 0x00, 0x01, 0x6d, 0x68, 0x00, 0x01, 0x6d, 0x94, 0x00, 0x01, 0x6d, 0xa4, + 0x00, 0x01, 0x6e, 0x14, 0x00, 0x01, 0x6e, 0x24, 0x00, 0x01, 0x6e, 0x34, 0x00, 0x01, 0x6e, 0x44, + 0x00, 0x01, 0x6e, 0xa0, 0x00, 0x01, 0x6e, 0xb0, 0x00, 0x01, 0x6e, 0xc0, 0x00, 0x01, 0x6e, 0xd0, + 0x00, 0x01, 0x6f, 0x80, 0x00, 0x01, 0x70, 0x5c, 0x00, 0x01, 0x70, 0x6c, 0x00, 0x01, 0x70, 0xf8, + 0x00, 0x01, 0x71, 0x88, 0x00, 0x01, 0x71, 0xf0, 0x00, 0x01, 0x72, 0x84, 0x00, 0x01, 0x73, 0x14, + 0x00, 0x01, 0x73, 0xe0, 0x00, 0x01, 0x74, 0x70, 0x00, 0x01, 0x75, 0x14, 0x00, 0x01, 0x76, 0x00, + 0x00, 0x01, 0x76, 0xac, 0x00, 0x01, 0x76, 0xbc, 0x00, 0x01, 0x77, 0xa8, 0x00, 0x01, 0x78, 0xc4, + 0x00, 0x01, 0x79, 0x0c, 0x00, 0x01, 0x79, 0xb4, 0x00, 0x01, 0x79, 0xc4, 0x00, 0x01, 0x7a, 0xb8, + 0x00, 0x01, 0x7b, 0x94, 0x00, 0x01, 0x7c, 0x08, 0x00, 0x01, 0x7c, 0x30, 0x00, 0x01, 0x7c, 0xdc, + 0x00, 0x01, 0x7d, 0x48, 0x00, 0x01, 0x7e, 0x2c, 0x00, 0x01, 0x7e, 0x90, 0x00, 0x01, 0x7e, 0xa0, + 0x00, 0x01, 0x7f, 0x08, 0x00, 0x01, 0x7f, 0x18, 0x00, 0x01, 0x7f, 0x28, 0x00, 0x01, 0x7f, 0x78, + 0x00, 0x01, 0x7f, 0x88, 0x00, 0x01, 0x80, 0x74, 0x00, 0x01, 0x80, 0x84, 0x00, 0x01, 0x80, 0xe8, + 0x00, 0x01, 0x81, 0x5c, 0x00, 0x01, 0x81, 0xdc, 0x00, 0x01, 0x82, 0x90, 0x00, 0x01, 0x83, 0x40, + 0x00, 0x01, 0x84, 0x0c, 0x00, 0x01, 0x84, 0xb4, 0x00, 0x01, 0x85, 0x68, 0x00, 0x01, 0x86, 0x50, + 0x00, 0x01, 0x86, 0xfc, 0x00, 0x01, 0x87, 0x28, 0x00, 0x01, 0x87, 0x58, 0x00, 0x01, 0x88, 0x34, + 0x00, 0x01, 0x88, 0x5c, 0x00, 0x01, 0x89, 0x10, 0x00, 0x01, 0x89, 0x20, 0x00, 0x01, 0x89, 0x30, + 0x00, 0x01, 0x89, 0x64, 0x00, 0x01, 0x89, 0x74, 0x00, 0x01, 0x8a, 0x48, 0x00, 0x01, 0x8b, 0x28, + 0x00, 0x01, 0x8b, 0x38, 0x00, 0x01, 0x8b, 0x64, 0x00, 0x01, 0x8b, 0x90, 0x00, 0x01, 0x8b, 0xb8, + 0x00, 0x01, 0x8c, 0x2c, 0x00, 0x01, 0x8d, 0x18, 0x00, 0x01, 0x8d, 0xc8, 0x00, 0x01, 0x8e, 0x90, + 0x00, 0x01, 0x8f, 0x90, 0x00, 0x01, 0x90, 0x78, 0x00, 0x01, 0x91, 0x30, 0x00, 0x01, 0x91, 0xcc, + 0x00, 0x01, 0x92, 0xb8, 0x00, 0x01, 0x93, 0xa4, 0x00, 0x01, 0x94, 0x6c, 0x00, 0x01, 0x95, 0x58, + 0x00, 0x01, 0x96, 0x24, 0x00, 0x01, 0x96, 0xe0, 0x00, 0x01, 0x97, 0x3c, 0x00, 0x01, 0x97, 0x90, + 0x00, 0x01, 0x98, 0x08, 0x00, 0x01, 0x98, 0x68, 0x00, 0x01, 0x99, 0x1c, 0x00, 0x01, 0x99, 0xcc, + 0x00, 0x01, 0x9a, 0xcc, 0x00, 0x01, 0x9b, 0xb4, 0x00, 0x01, 0x9d, 0x0c, 0x00, 0x01, 0x9e, 0x34, + 0x00, 0x01, 0x9e, 0xd4, 0x00, 0x01, 0x9f, 0x78, 0x00, 0x01, 0xa0, 0x70, 0x00, 0x01, 0xa1, 0x5c, + 0x00, 0x01, 0xa2, 0x18, 0x00, 0x01, 0xa2, 0xd4, 0x00, 0x01, 0xa3, 0x64, 0x00, 0x01, 0xa3, 0xfc, + 0x00, 0x01, 0xa4, 0x7c, 0x00, 0x01, 0xa5, 0x18, 0x00, 0x01, 0xa5, 0xd4, 0x00, 0x01, 0xa6, 0x54, + 0x00, 0x01, 0xa7, 0x24, 0x00, 0x01, 0xa7, 0xf0, 0x00, 0x01, 0xa9, 0x50, 0x00, 0x01, 0xaa, 0x88, + 0x00, 0x01, 0xaa, 0x98, 0x00, 0x01, 0xaa, 0xa8, 0x00, 0x01, 0xab, 0x08, 0x00, 0x01, 0xab, 0x64, + 0x00, 0x01, 0xab, 0x74, 0x00, 0x01, 0xab, 0xf8, 0x00, 0x01, 0xac, 0xd4, 0x00, 0x01, 0xad, 0x9c, + 0x00, 0x01, 0xae, 0x40, 0x00, 0x01, 0xae, 0xe4, 0x00, 0x01, 0xaf, 0x64, 0x00, 0x01, 0xaf, 0xe0, + 0x00, 0x01, 0xb0, 0x78, 0x00, 0x01, 0xb1, 0x40, 0x00, 0x01, 0xb1, 0xdc, 0x00, 0x01, 0xb2, 0x98, + 0x00, 0x01, 0xb3, 0x20, 0x00, 0x01, 0xb3, 0x30, 0x00, 0x01, 0xb4, 0x38, 0x00, 0x01, 0xb5, 0x40, + 0x00, 0x01, 0xb6, 0x3c, 0x00, 0x01, 0xb7, 0x40, 0x00, 0x01, 0xb7, 0x50, 0x00, 0x01, 0xb7, 0x7c, + 0x00, 0x01, 0xb7, 0xa4, 0x00, 0x01, 0xb8, 0x68, 0x00, 0x01, 0xb9, 0x2c, 0x00, 0x01, 0xb9, 0xd4, + 0x00, 0x01, 0xba, 0x78, 0x00, 0x01, 0xbb, 0x18, 0x00, 0x01, 0xbb, 0xac, 0x00, 0x01, 0xbc, 0x5c, + 0x00, 0x01, 0xbd, 0x04, 0x00, 0x01, 0xbd, 0xa4, 0x00, 0x01, 0xbe, 0x44, 0x00, 0x01, 0xbf, 0x50, + 0x00, 0x01, 0xc0, 0x1c, 0x00, 0x01, 0xc0, 0x74, 0x00, 0x01, 0xc0, 0xa0, 0x00, 0x01, 0xc0, 0xc8, + 0x00, 0x01, 0xc0, 0xfc, 0x00, 0x01, 0xc1, 0x2c, 0x00, 0x01, 0xc1, 0x3c, 0x00, 0x01, 0xc1, 0x4c, + 0x00, 0x01, 0xc1, 0x78, 0x00, 0x01, 0xc1, 0xa0, 0x00, 0x01, 0xc1, 0xb0, 0x00, 0x01, 0xc2, 0x6c, + 0x00, 0x01, 0xc2, 0xa0, 0x00, 0x01, 0xc2, 0xd4, 0x00, 0x01, 0xc3, 0x08, 0x00, 0x01, 0xc3, 0x38, + 0x00, 0x01, 0xc3, 0x6c, 0x00, 0x01, 0xc3, 0x9c, 0x00, 0x01, 0xc3, 0xac, 0x00, 0x01, 0xc3, 0xbc, + 0x00, 0x01, 0xc3, 0xe8, 0x00, 0x01, 0xc4, 0x10, 0x00, 0x01, 0xc4, 0x44, 0x00, 0x01, 0xc4, 0x74, + 0x00, 0x01, 0xc4, 0xa8, 0x00, 0x01, 0xc4, 0xd8, 0x00, 0x01, 0xc5, 0x78, 0x00, 0x01, 0xc6, 0x24, + 0x00, 0x01, 0xc6, 0x58, 0x00, 0x01, 0xc6, 0x88, 0x00, 0x01, 0xc6, 0xbc, 0x00, 0x01, 0xc6, 0xec, + 0x00, 0x01, 0xc7, 0x18, 0x00, 0x01, 0xc7, 0x40, 0x00, 0x01, 0xc7, 0x74, 0x00, 0x01, 0xc7, 0xa4, + 0x00, 0x01, 0xc7, 0xd8, 0x00, 0x01, 0xc8, 0x08, 0x00, 0x01, 0xc8, 0x3c, 0x00, 0x01, 0xc8, 0x6c, + 0x00, 0x01, 0xc8, 0xe0, 0x00, 0x01, 0xc9, 0x34, 0x00, 0x01, 0xc9, 0x68, 0x00, 0x01, 0xc9, 0x98, + 0x00, 0x01, 0xca, 0xd8, 0x00, 0x01, 0xcb, 0x04, 0x00, 0x01, 0xcc, 0x0c, 0x00, 0x01, 0xcc, 0xd4, + 0x00, 0x01, 0xcd, 0x78, 0x00, 0x01, 0xce, 0x54, 0x00, 0x01, 0xce, 0xac, 0x00, 0x01, 0xce, 0xbc, + 0x00, 0x01, 0xce, 0xcc, 0x00, 0x01, 0xce, 0xdc, 0x00, 0x01, 0xce, 0xec, 0x00, 0x01, 0xce, 0xfc, + 0x00, 0x01, 0xcf, 0x0c, 0x00, 0x01, 0xcf, 0x1c, 0x00, 0x01, 0xcf, 0xc4, 0x00, 0x01, 0xcf, 0xd4, + 0x00, 0x01, 0xcf, 0xe4, 0x00, 0x01, 0xd0, 0x4c, 0x00, 0x01, 0xd0, 0x5c, 0x00, 0x01, 0xd0, 0x6c, + 0x00, 0x01, 0xd0, 0xcc, 0x00, 0x01, 0xd0, 0xdc, 0x00, 0x01, 0xd0, 0xec, 0x00, 0x01, 0xd0, 0xfc, + 0x00, 0x01, 0xd1, 0xd0, 0x00, 0x01, 0xd1, 0xe0, 0x00, 0x01, 0xd1, 0xf0, 0x00, 0x01, 0xd2, 0x00, + 0x00, 0x01, 0xd2, 0x10, 0x00, 0x01, 0xd3, 0x14, 0x00, 0x01, 0xd3, 0xd8, 0x00, 0x01, 0xd4, 0x98, + 0x00, 0x01, 0xd5, 0x90, 0x00, 0x01, 0xd6, 0x40, 0x00, 0x01, 0xd7, 0x38, 0x00, 0x01, 0xd8, 0x48, + 0x00, 0x01, 0xd8, 0xf4, 0x00, 0x01, 0xd9, 0x68, 0x00, 0x01, 0xda, 0x00, 0x00, 0x01, 0xda, 0x70, + 0x00, 0x01, 0xdb, 0x10, 0x00, 0x01, 0xdb, 0xb0, 0x00, 0x01, 0xdb, 0xc0, 0x00, 0x01, 0xdb, 0xd0, + 0x00, 0x01, 0xdc, 0xd8, 0x00, 0x01, 0xdc, 0xe8, 0x00, 0x01, 0xdc, 0xf8, 0x00, 0x01, 0xdd, 0x8c, + 0x00, 0x01, 0xde, 0x48, 0x00, 0x01, 0xde, 0xfc, 0x00, 0x01, 0xdf, 0x88, 0x00, 0x01, 0xdf, 0xf0, + 0x00, 0x01, 0xe0, 0xd4, 0x00, 0x01, 0xe0, 0xe4, 0x00, 0x01, 0xe1, 0x9c, 0x00, 0x01, 0xe2, 0x98, + 0x00, 0x01, 0xe2, 0xc0, 0x00, 0x01, 0xe2, 0xd8, 0x00, 0x01, 0xe3, 0x00, 0x00, 0x01, 0xe3, 0x28, + 0x00, 0x01, 0xe3, 0x5c, 0x00, 0x01, 0xe3, 0x84, 0x00, 0x01, 0xe3, 0xac, 0x00, 0x01, 0xe3, 0xe0, + 0x00, 0x01, 0xe4, 0x08, 0x00, 0x01, 0xe4, 0x30, 0x00, 0x01, 0xe4, 0x58, 0x00, 0x01, 0xe4, 0x80, + 0x00, 0x01, 0xe4, 0xac, 0x00, 0x01, 0xe4, 0xdc, 0x00, 0x01, 0xe5, 0x18, 0x00, 0x01, 0xe5, 0x40, + 0x00, 0x01, 0xe5, 0x70, 0x00, 0x01, 0xe5, 0x98, 0x00, 0x01, 0xe5, 0xd0, 0x00, 0x01, 0xe5, 0xf8, + 0x00, 0x01, 0xe6, 0x24, 0x00, 0x01, 0xe6, 0x50, 0x00, 0x01, 0xe6, 0xdc, 0x00, 0x01, 0xe7, 0x08, + 0x00, 0x01, 0xe7, 0x34, 0x00, 0x01, 0xe7, 0x64, 0x00, 0x01, 0xe7, 0x98, 0x00, 0x01, 0xe7, 0xc8, + 0x00, 0x01, 0xe7, 0xf8, 0x00, 0x01, 0xe8, 0x2c, 0x00, 0x01, 0xe8, 0x60, 0x00, 0x01, 0xe8, 0x88, + 0x00, 0x01, 0xe8, 0xb0, 0x00, 0x01, 0xe8, 0xdc, 0x00, 0x01, 0xe9, 0x08, 0x00, 0x01, 0xe9, 0x34, + 0x00, 0x01, 0xe9, 0x60, 0x00, 0x01, 0xe9, 0x8c, 0x00, 0x01, 0xe9, 0xb8, 0x00, 0x01, 0xe9, 0xe0, + 0x00, 0x01, 0xea, 0x0c, 0x00, 0x01, 0xea, 0x3c, 0x00, 0x01, 0xea, 0x70, 0x00, 0x01, 0xea, 0xa0, + 0x00, 0x01, 0xea, 0xd0, 0x00, 0x01, 0xea, 0xf8, 0x00, 0x01, 0xeb, 0x20, 0x00, 0x01, 0xeb, 0x4c, + 0x00, 0x01, 0xeb, 0x78, 0x00, 0x01, 0xeb, 0xa4, 0x00, 0x01, 0xeb, 0xd0, 0x00, 0x01, 0xeb, 0xfc, + 0x00, 0x01, 0xec, 0x28, 0x00, 0x01, 0xec, 0x58, 0x00, 0x01, 0xec, 0x8c, 0x00, 0x01, 0xec, 0xbc, + 0x00, 0x01, 0xec, 0xec, 0x00, 0x01, 0xed, 0x20, 0x00, 0x01, 0xed, 0x54, 0x00, 0x01, 0xed, 0x7c, + 0x00, 0x01, 0xed, 0xa4, 0x00, 0x01, 0xed, 0xd0, 0x00, 0x01, 0xed, 0xfc, 0x00, 0x01, 0xee, 0x28, + 0x00, 0x01, 0xee, 0x54, 0x00, 0x01, 0xee, 0x80, 0x00, 0x01, 0xee, 0xac, 0x00, 0x01, 0xee, 0xd8, + 0x00, 0x01, 0xef, 0x04, 0x00, 0x01, 0xef, 0x34, 0x00, 0x01, 0xef, 0x68, 0x00, 0x01, 0xef, 0x98, + 0x00, 0x01, 0xef, 0xc8, 0x00, 0x01, 0xef, 0xfc, 0x00, 0x01, 0xf0, 0x30, 0x00, 0x01, 0xf0, 0x58, + 0x00, 0x01, 0xf0, 0x80, 0x00, 0x01, 0xf0, 0xac, 0x00, 0x01, 0xf0, 0xd8, 0x00, 0x01, 0xf1, 0x04, + 0x00, 0x01, 0xf1, 0x30, 0x00, 0x01, 0xf1, 0x5c, 0x00, 0x01, 0xf1, 0x88, 0x00, 0x01, 0xf1, 0xb0, + 0x00, 0x01, 0xf1, 0xd8, 0x00, 0x01, 0xf2, 0x08, 0x00, 0x01, 0xf2, 0x38, 0x00, 0x01, 0xf2, 0x68, + 0x00, 0x01, 0xf2, 0x98, 0x00, 0x01, 0xf2, 0xc0, 0x00, 0x01, 0xf2, 0xe8, 0x00, 0x01, 0xf3, 0x14, + 0x00, 0x01, 0xf3, 0x40, 0x00, 0x01, 0xf3, 0x6c, 0x00, 0x01, 0xf3, 0x98, 0x00, 0x01, 0xf3, 0xc0, + 0x00, 0x01, 0xf3, 0xe8, 0x00, 0x01, 0xf4, 0x18, 0x00, 0x01, 0xf4, 0x48, 0x00, 0x01, 0xf4, 0x78, + 0x00, 0x01, 0xf4, 0xa8, 0x00, 0x01, 0xf4, 0xd8, 0x00, 0x01, 0xf5, 0x08, 0x00, 0x01, 0xf5, 0x30, + 0x00, 0x01, 0xf5, 0x5c, 0x00, 0x01, 0xf5, 0x88, 0x00, 0x01, 0xf5, 0xb4, 0x00, 0x01, 0xf5, 0xe0, + 0x00, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xf6, 0x3c, 0x00, 0x01, 0xf6, 0x70, 0x00, 0x01, 0xf6, 0xa0, + 0x00, 0x01, 0xf6, 0xd0, 0x00, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xf7, 0x38, 0x00, 0x01, 0xf7, 0x60, + 0x00, 0x01, 0xf7, 0x88, 0x00, 0x01, 0xf7, 0xb4, 0x00, 0x01, 0xf7, 0xe0, 0x00, 0x01, 0xf8, 0x0c, + 0x00, 0x01, 0xf8, 0x38, 0x00, 0x01, 0xf8, 0x64, 0x00, 0x01, 0xf8, 0x90, 0x00, 0x01, 0xf8, 0xb8, + 0x00, 0x01, 0xf8, 0xe0, 0x00, 0x01, 0xf9, 0x08, 0x00, 0x01, 0xf9, 0x30, 0x00, 0x01, 0xf9, 0x58, + 0x00, 0x01, 0xf9, 0x80, 0x00, 0x01, 0xf9, 0xa8, 0x00, 0x01, 0xf9, 0xd0, 0x00, 0x01, 0xf9, 0xf8, + 0x00, 0x01, 0xfa, 0x20, 0x00, 0x01, 0xfa, 0x48, 0x00, 0x01, 0xfa, 0x70, 0x00, 0x01, 0xfa, 0x98, + 0x00, 0x01, 0xfa, 0xc0, 0x00, 0x01, 0xfa, 0xf0, 0x00, 0x01, 0xfb, 0x20, 0x00, 0x01, 0xfb, 0x50, + 0x00, 0x01, 0xfb, 0x80, 0x00, 0x01, 0xfb, 0xb0, 0x00, 0x01, 0xfb, 0xe0, 0x00, 0x01, 0xfc, 0x10, + 0x00, 0x01, 0xfc, 0x40, 0x00, 0x01, 0xfc, 0x58, 0x00, 0x01, 0xfc, 0x70, 0x00, 0x01, 0xfc, 0x88, + 0x00, 0x01, 0xfc, 0xa0, 0x00, 0x01, 0xfc, 0xb8, 0x00, 0x01, 0xfc, 0xd0, 0x00, 0x01, 0xfc, 0xe8, + 0x00, 0x01, 0xfd, 0x00, 0x00, 0x01, 0xfd, 0x30, 0x00, 0x01, 0xfd, 0x60, 0x00, 0x01, 0xfd, 0x90, + 0x00, 0x01, 0xfd, 0xc0, 0x00, 0x01, 0xfd, 0xf0, 0x00, 0x01, 0xfe, 0x20, 0x00, 0x01, 0xfe, 0x50, + 0x00, 0x01, 0xfe, 0x80, 0x00, 0x01, 0xfe, 0x98, 0x00, 0x01, 0xfe, 0xb0, 0x00, 0x01, 0xfe, 0xc8, + 0x00, 0x01, 0xfe, 0xe0, 0x00, 0x01, 0xfe, 0xf8, 0x00, 0x01, 0xff, 0x10, 0x00, 0x01, 0xff, 0x28, + 0x00, 0x01, 0xff, 0x40, 0x00, 0x01, 0xff, 0x6c, 0x00, 0x01, 0xff, 0x98, 0x00, 0x01, 0xff, 0xc8, + 0x00, 0x01, 0xff, 0xf8, 0x00, 0x02, 0x00, 0x28, 0x00, 0x02, 0x00, 0x58, 0x00, 0x02, 0x00, 0x88, + 0x00, 0x02, 0x00, 0xb8, 0x00, 0x02, 0x00, 0xe0, 0x00, 0x02, 0x01, 0x08, 0x00, 0x02, 0x01, 0x34, + 0x00, 0x02, 0x01, 0x60, 0x00, 0x02, 0x01, 0x8c, 0x00, 0x02, 0x01, 0xb8, 0x00, 0x02, 0x01, 0xe4, + 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x02, 0x3c, 0x00, 0x02, 0x02, 0x68, 0x00, 0x02, 0x02, 0x94, + 0x00, 0x02, 0x02, 0xbc, 0x00, 0x02, 0x02, 0xe8, 0x00, 0x02, 0x03, 0x10, 0x00, 0x02, 0x03, 0x3c, + 0x00, 0x02, 0x03, 0x68, 0x00, 0x02, 0x03, 0x94, 0x00, 0x02, 0x03, 0xbc, 0x00, 0x02, 0x03, 0xe4, + 0x00, 0x02, 0x04, 0x8c, 0x00, 0x02, 0x04, 0x9c, 0x00, 0x02, 0x04, 0xe4, 0x00, 0x02, 0x05, 0x30, + 0x00, 0x02, 0x05, 0x8c, 0x00, 0x02, 0x06, 0x5c, 0x00, 0x02, 0x06, 0x8c, 0x00, 0x02, 0x06, 0xb4, + 0x00, 0x02, 0x06, 0xe4, 0x00, 0x02, 0x07, 0x10, 0x00, 0x02, 0x07, 0x40, 0x00, 0x02, 0x07, 0x68, + 0x00, 0x02, 0x07, 0x90, 0x00, 0x02, 0x07, 0xb8, 0x00, 0x02, 0x07, 0xe0, 0x00, 0x02, 0x08, 0xa4, + 0x00, 0x02, 0x09, 0x10, 0x00, 0x02, 0x09, 0x7c, 0x00, 0x02, 0x0a, 0x2c, 0x00, 0x02, 0x0a, 0x58, + 0x00, 0x02, 0x0a, 0x84, 0x00, 0x02, 0x0a, 0xc0, 0x00, 0x02, 0x0a, 0xfc, 0x00, 0x02, 0x0b, 0x28, + 0x00, 0x02, 0x0b, 0x60, 0x00, 0x02, 0x0b, 0x8c, 0x00, 0x02, 0x0b, 0xb8, 0x00, 0x02, 0x0b, 0xe0, + 0x00, 0x02, 0x0c, 0x08, 0x00, 0x02, 0x0c, 0x6c, 0x00, 0x02, 0x0c, 0xd0, 0x00, 0x02, 0x0d, 0x74, + 0x00, 0x02, 0x0d, 0x9c, 0x00, 0x02, 0x0d, 0xc4, 0x00, 0x02, 0x0d, 0xfc, 0x00, 0x02, 0x0e, 0x34, + 0x00, 0x02, 0x0e, 0x60, 0x00, 0x02, 0x0e, 0x8c, 0x00, 0x02, 0x0e, 0xb4, 0x00, 0x02, 0x0e, 0xe8, + 0x00, 0x02, 0x0f, 0x14, 0x00, 0x02, 0x0f, 0x40, 0x00, 0x02, 0x0f, 0x68, 0x00, 0x02, 0x0f, 0x90, + 0x00, 0x02, 0x0f, 0xb8, 0x00, 0x02, 0x10, 0x3c, 0x00, 0x02, 0x10, 0x4c, 0x00, 0x02, 0x10, 0x78, + 0x00, 0x02, 0x10, 0xa8, 0x00, 0x02, 0x10, 0xcc, 0x00, 0x02, 0x10, 0xf8, 0x00, 0x02, 0x11, 0x24, + 0x00, 0x02, 0x11, 0x54, 0x00, 0x02, 0x11, 0x7c, 0x00, 0x02, 0x11, 0xa4, 0x00, 0x02, 0x11, 0xcc, + 0x00, 0x02, 0x11, 0xf4, 0x00, 0x02, 0x13, 0xc0, 0x00, 0x02, 0x13, 0xec, 0x00, 0x02, 0x14, 0x38, + 0x00, 0x02, 0x14, 0x68, 0x00, 0x02, 0x14, 0x98, 0x00, 0x02, 0x14, 0xcc, 0x00, 0x02, 0x15, 0x00, + 0x00, 0x02, 0x15, 0x34, 0x00, 0x02, 0x15, 0x68, 0x00, 0x02, 0x15, 0x9c, 0x00, 0x02, 0x15, 0xd0, + 0x00, 0x02, 0x16, 0x00, 0x00, 0x02, 0x16, 0x30, 0x00, 0x02, 0x16, 0x64, 0x00, 0x02, 0x16, 0x98, + 0x00, 0x02, 0x16, 0xcc, 0x00, 0x02, 0x17, 0x00, 0x00, 0x02, 0x17, 0x34, 0x00, 0x02, 0x17, 0x68, + 0x00, 0x02, 0x17, 0x98, 0x00, 0x02, 0x17, 0xc8, 0x00, 0x02, 0x17, 0xfc, 0x00, 0x02, 0x18, 0x30, + 0x00, 0x02, 0x18, 0x64, 0x00, 0x02, 0x18, 0x98, 0x00, 0x02, 0x18, 0xcc, 0x00, 0x02, 0x19, 0x00, + 0x00, 0x02, 0x19, 0x24, 0x00, 0x02, 0x19, 0x48, 0x00, 0x02, 0x19, 0x6c, 0x00, 0x02, 0x1a, 0x58, + 0x00, 0x02, 0x1b, 0xcc, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x02, 0x25, 0xb0, 0x00, 0x02, 0x25, 0xd4, + 0x00, 0x02, 0x26, 0x0c, 0x00, 0x02, 0x26, 0x44, 0x00, 0x02, 0x26, 0x7c, 0x00, 0x02, 0x26, 0xa8, + 0x00, 0x02, 0x26, 0xd4, 0x00, 0x02, 0x27, 0x14, 0x00, 0x02, 0x27, 0x6c, 0x00, 0x02, 0x27, 0xc0, + 0x00, 0x02, 0x28, 0x0c, 0x00, 0x02, 0x28, 0x78, 0x00, 0x02, 0x29, 0x04, 0x00, 0x02, 0x29, 0x84, + 0x00, 0x02, 0x29, 0xbc, 0x00, 0x02, 0x2a, 0x48, 0x00, 0x02, 0x2a, 0xb4, 0x00, 0x02, 0x2b, 0x20, + 0x00, 0x02, 0x2b, 0x88, 0x00, 0x02, 0x2b, 0xf0, 0x00, 0x02, 0x2c, 0x60, 0x00, 0x02, 0x2c, 0xc0, + 0x00, 0x02, 0x2d, 0x28, 0x00, 0x02, 0x2d, 0x68, 0x00, 0x02, 0x2e, 0x30, 0x00, 0x02, 0x2e, 0xb4, + 0x00, 0x02, 0x2f, 0x54, 0x00, 0x02, 0x2f, 0xd0, 0x00, 0x02, 0x30, 0x3c, 0x00, 0x02, 0x30, 0xb0, + 0x00, 0x02, 0x31, 0x4c, 0x00, 0x02, 0x31, 0xf0, 0x00, 0x02, 0x32, 0x84, 0x00, 0x02, 0x32, 0xc8, + 0x00, 0x02, 0x33, 0x20, 0x00, 0x02, 0x33, 0x78, 0x00, 0x02, 0x33, 0xec, 0x00, 0x02, 0x34, 0x54, + 0x00, 0x02, 0x34, 0xbc, 0x00, 0x02, 0x35, 0x28, 0x00, 0x02, 0x35, 0x98, 0x00, 0x02, 0x36, 0x08, + 0x00, 0x02, 0x36, 0x34, 0x00, 0x02, 0x38, 0x3c, 0x00, 0x02, 0x3b, 0xfc, 0x00, 0x02, 0x3f, 0x64, + 0x00, 0x02, 0x3f, 0xfc, 0x00, 0x02, 0x40, 0x6c, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0xc2, + 0x02, 0xee, 0x00, 0x03, 0x00, 0x07, 0x00, 0x32, 0x40, 0x21, 0x00, 0x03, 0x30, 0x03, 0x40, 0x03, + 0x03, 0x03, 0x82, 0x04, 0x07, 0x82, 0x10, 0x00, 0x20, 0x00, 0x30, 0x00, 0x60, 0x00, 0x70, 0x00, + 0x05, 0x00, 0x08, 0x06, 0x81, 0x01, 0xb8, 0x07, 0x81, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x33, 0x11, 0x21, 0x11, 0x27, 0x11, + 0x21, 0x11, 0x32, 0x01, 0x90, 0x32, 0xfe, 0xd4, 0x02, 0xee, 0xfd, 0x12, 0x32, 0x02, 0x8a, 0xfd, + 0x76, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xf4, 0x01, 0x4d, 0x02, 0x6b, 0x00, 0x0d, + 0x00, 0x19, 0x00, 0x1d, 0x40, 0x0e, 0x0e, 0x71, 0x14, 0x00, 0x6f, 0x0b, 0x1a, 0x06, 0x17, 0x75, + 0x11, 0x10, 0x0c, 0x02, 0x00, 0x3f, 0x3f, 0xfd, 0xce, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, + 0x30, 0x01, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, 0x03, 0x35, 0x35, 0x33, 0x13, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x41, 0x03, 0x05, 0x07, 0x04, 0x66, 0x05, + 0x07, 0x06, 0x03, 0x8e, 0x0c, 0x33, 0x20, 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x01, 0xc7, 0x24, + 0x39, 0x35, 0x34, 0x20, 0x20, 0x35, 0x34, 0x39, 0x24, 0xa4, 0xfd, 0xdc, 0x27, 0x2c, 0x2c, 0x27, + 0x26, 0x2c, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x57, 0x01, 0x8e, 0x01, 0x9f, 0x02, 0xa7, 0x00, 0x0d, + 0x00, 0x1b, 0x00, 0x36, 0x40, 0x11, 0x01, 0x6e, 0x0d, 0x0f, 0x6e, 0x40, 0x1b, 0x01, 0x02, 0x90, + 0x1b, 0xa0, 0x1b, 0xb0, 0x1b, 0x03, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x09, 0x0f, 0x48, 0x1b, + 0x1c, 0x1b, 0x15, 0x0e, 0xa0, 0x06, 0x0d, 0xa0, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x2f, 0x01, 0x10, + 0xd6, 0x2b, 0x5d, 0x5f, 0x71, 0xfd, 0xde, 0xed, 0x31, 0x30, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x07, + 0x23, 0x2e, 0x03, 0x35, 0x35, 0x23, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, 0x03, 0x35, 0x35, + 0x01, 0x9f, 0x05, 0x09, 0x0a, 0x05, 0x48, 0x05, 0x0a, 0x09, 0x06, 0x42, 0x05, 0x09, 0x0b, 0x05, + 0x47, 0x05, 0x0a, 0x09, 0x06, 0x02, 0xa7, 0x31, 0x19, 0x3b, 0x3e, 0x3c, 0x1a, 0x1a, 0x3c, 0x3e, + 0x3c, 0x19, 0x30, 0x31, 0x19, 0x3b, 0x3e, 0x3c, 0x1a, 0x1a, 0x3c, 0x3e, 0x3c, 0x19, 0x30, 0x00, + 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe3, 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x1f, 0x01, 0x6a, + 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0xb7, 0x0f, 0x10, + 0x00, 0x4c, 0x4f, 0x17, 0x01, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x14, 0xb8, 0xff, + 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x13, 0xb8, + 0xff, 0xc0, 0xb7, 0x09, 0x0a, 0x00, 0x4c, 0x70, 0x13, 0x01, 0x12, 0xb8, 0xff, 0x80, 0xb3, 0x10, + 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xf8, 0x40, 0x09, + 0x10, 0x00, 0x4d, 0x11, 0x40, 0x0f, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, + 0x10, 0xb8, 0xff, 0xd0, 0xb3, 0x10, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x0a, 0x00, + 0x4c, 0x7c, 0x10, 0x01, 0x0f, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0e, 0xb8, 0xff, + 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0xb6, 0x0a, 0x00, 0x4d, 0x40, 0x0c, 0x01, + 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, + 0x02, 0xb8, 0xff, 0xc0, 0xb4, 0x0f, 0x10, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x65, 0x0d, + 0x00, 0x4d, 0x11, 0x1d, 0x1e, 0x04, 0x04, 0x05, 0x10, 0x79, 0x0f, 0x07, 0x01, 0x0e, 0x0b, 0x0a, + 0x07, 0x04, 0x0f, 0x0f, 0x01, 0x0f, 0x06, 0x0c, 0x10, 0x08, 0x01, 0x08, 0x0f, 0x05, 0x01, 0x05, + 0x79, 0x1f, 0x06, 0x01, 0x00, 0x06, 0x01, 0x06, 0x21, 0x1a, 0x16, 0x0f, 0x03, 0x01, 0x00, 0x1f, + 0x01, 0x12, 0x1c, 0x1f, 0x03, 0x04, 0x02, 0x13, 0x79, 0x14, 0x02, 0x79, 0x01, 0x19, 0x01, 0x15, + 0x18, 0x19, 0x00, 0x04, 0x01, 0x14, 0x20, 0x1c, 0x0b, 0x18, 0x72, 0x11, 0x0e, 0x15, 0x13, 0x08, + 0x0f, 0x08, 0x19, 0x1e, 0x1e, 0x0a, 0x72, 0x04, 0x07, 0x03, 0x03, 0x00, 0x1f, 0x04, 0x01, 0x04, + 0x06, 0x02, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0xcd, 0x5d, 0x32, 0x32, 0x2f, 0x32, 0x10, 0xed, 0x32, + 0x11, 0x33, 0x3f, 0x3f, 0xdd, 0x32, 0x32, 0xed, 0x32, 0x32, 0x01, 0x10, 0xde, 0xdd, 0x17, 0x39, + 0x5d, 0xed, 0x10, 0xed, 0x11, 0x17, 0x39, 0x5d, 0x5d, 0xde, 0xc0, 0x10, 0xd4, 0x5d, 0x5d, 0xed, + 0x5d, 0xde, 0x5d, 0xc0, 0x10, 0xdc, 0x5d, 0x17, 0x39, 0x5d, 0xed, 0x11, 0x17, 0x39, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x13, 0x37, 0x33, 0x07, 0x33, 0x37, + 0x33, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x07, 0x23, 0x37, 0x23, 0x07, 0x23, 0x37, + 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x17, 0x33, 0x37, 0x23, 0x8a, 0x1d, 0x66, 0x1e, 0x50, 0x1d, + 0x66, 0x1d, 0x3e, 0x52, 0x15, 0x67, 0x7a, 0x1d, 0x66, 0x1d, 0x50, 0x1c, 0x66, 0x1d, 0x3c, 0x4f, + 0x15, 0x64, 0xb5, 0x50, 0x14, 0x4f, 0x01, 0xd3, 0x98, 0x98, 0x98, 0x98, 0x66, 0x6e, 0x66, 0x99, + 0x99, 0x99, 0x99, 0x66, 0x6e, 0x66, 0xd4, 0x6e, 0x00, 0x01, 0x00, 0x22, 0xff, 0x9f, 0x01, 0xd3, + 0x02, 0xb5, 0x00, 0x37, 0x00, 0x3f, 0x40, 0x21, 0x1f, 0x0a, 0x63, 0x30, 0x39, 0x26, 0x63, 0x14, + 0x03, 0x38, 0x1a, 0x1a, 0x00, 0x61, 0x36, 0x19, 0x61, 0x1b, 0x0f, 0x67, 0x2b, 0x2b, 0x19, 0x07, + 0x67, 0x00, 0x36, 0x87, 0x23, 0x67, 0x19, 0x1b, 0x10, 0x00, 0x3f, 0xdd, 0xed, 0x3f, 0xdd, 0xed, + 0x11, 0x39, 0x10, 0xed, 0x01, 0x2f, 0xed, 0x2f, 0xed, 0x32, 0x2f, 0x10, 0xd6, 0xd6, 0xed, 0x10, + 0xde, 0xed, 0xc4, 0x31, 0x30, 0x37, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x15, 0x23, 0xc1, 0x3f, 0x4d, 0x13, 0x26, 0x20, 0x56, 0x30, 0x38, 0x2c, 0x11, + 0x21, 0x30, 0x1e, 0x1d, 0x38, 0x2c, 0x1b, 0x0f, 0x21, 0x36, 0x27, 0x72, 0x2e, 0x47, 0x14, 0x1c, + 0x1d, 0x4f, 0x2a, 0x30, 0x25, 0x0d, 0x1b, 0x26, 0x1a, 0x27, 0x42, 0x30, 0x1b, 0x10, 0x25, 0x3d, + 0x2e, 0x72, 0x09, 0x06, 0x1c, 0x0b, 0x62, 0x0f, 0x19, 0x1d, 0x1f, 0x12, 0x1a, 0x15, 0x11, 0x0b, + 0x0a, 0x1a, 0x25, 0x35, 0x27, 0x1c, 0x34, 0x2c, 0x21, 0x09, 0x61, 0x5c, 0x04, 0x14, 0x08, 0x67, + 0x0c, 0x13, 0x22, 0x17, 0x10, 0x15, 0x10, 0x0f, 0x09, 0x0f, 0x21, 0x2b, 0x3a, 0x27, 0x1b, 0x35, + 0x2d, 0x21, 0x07, 0x6b, 0x00, 0x05, 0x00, 0x02, 0xff, 0xf3, 0x01, 0xf2, 0x02, 0x79, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0xef, 0xb5, 0x27, 0x10, 0x0b, 0x00, 0x4d, + 0x22, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xf0, 0xb6, 0x0b, 0x00, 0x4d, + 0x1f, 0x16, 0x01, 0x08, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x06, 0x20, 0x0b, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe0, 0xb3, 0x18, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xf0, 0x40, 0x42, 0x17, 0x00, 0x4d, 0x10, 0x22, 0xa0, 0x22, 0xb0, 0x22, + 0x03, 0x22, 0x7c, 0x28, 0x1f, 0x04, 0xaf, 0x04, 0xbf, 0x04, 0x03, 0x04, 0x7c, 0x16, 0x00, 0x28, + 0x01, 0x0f, 0x16, 0x01, 0x28, 0x16, 0x28, 0x16, 0x1c, 0xaf, 0x10, 0xbf, 0x10, 0x02, 0x10, 0x7c, + 0x60, 0x0a, 0x70, 0x0a, 0x80, 0x0a, 0x03, 0x0a, 0x35, 0x02, 0x03, 0x35, 0xa0, 0x2e, 0xb0, 0x2e, + 0x02, 0x2e, 0x7c, 0x1c, 0x34, 0x00, 0x01, 0x34, 0x2b, 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x13, 0x16, + 0x48, 0x2b, 0x7d, 0x1f, 0x05, 0xaf, 0x19, 0xbf, 0x19, 0xcf, 0x19, 0x03, 0x19, 0x7d, 0x0d, 0x0d, + 0x70, 0x07, 0x01, 0x07, 0x7d, 0x13, 0x25, 0x7d, 0x31, 0xc0, 0x13, 0x01, 0xb7, 0x13, 0x01, 0xcf, + 0x31, 0x01, 0x13, 0x31, 0x13, 0x31, 0x03, 0x02, 0x00, 0x10, 0x00, 0x3f, 0x3f, 0x39, 0x39, 0x2f, + 0x2f, 0x5d, 0x5d, 0x5d, 0x10, 0xed, 0x10, 0xed, 0x5d, 0x3f, 0xed, 0x5d, 0x3f, 0xed, 0x2b, 0x01, + 0x10, 0xd6, 0xcd, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xde, 0xcd, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x12, + 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x5d, 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x33, 0x23, 0x01, 0x33, 0x03, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x5b, 0x59, 0x01, + 0x97, 0x59, 0xe9, 0x3c, 0x34, 0x35, 0x3c, 0x3c, 0x35, 0x34, 0x3c, 0x91, 0x14, 0x0e, 0x0e, 0x11, + 0x11, 0x0e, 0x0e, 0x14, 0xfe, 0x70, 0x3c, 0x33, 0x36, 0x3c, 0x3c, 0x36, 0x33, 0x3c, 0x90, 0x14, + 0x0d, 0x0e, 0x12, 0x12, 0x0e, 0x0d, 0x14, 0x02, 0x6b, 0xfe, 0x23, 0x4c, 0x4f, 0x4f, 0x4c, 0x4c, + 0x4f, 0x4f, 0x4c, 0x2a, 0x24, 0x24, 0x2a, 0x2a, 0x22, 0x22, 0x01, 0x7a, 0x4c, 0x4f, 0x4f, 0x4c, + 0x4c, 0x50, 0x50, 0x4c, 0x2a, 0x23, 0x23, 0x2a, 0x2a, 0x22, 0x22, 0x00, 0x00, 0x03, 0x00, 0x15, + 0xff, 0xf8, 0x01, 0xe2, 0x02, 0x79, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0xc2, 0xb9, 0x00, + 0x3f, 0xff, 0xf8, 0x40, 0x0e, 0x0b, 0x00, 0x4d, 0x25, 0x40, 0x0a, 0x00, 0x4d, 0x22, 0x40, 0x0d, + 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x09, + 0x0d, 0x00, 0x4d, 0x39, 0x40, 0x0c, 0x00, 0x4d, 0x2e, 0xb8, 0xff, 0x80, 0xb3, 0x0b, 0x00, 0x4d, + 0x2e, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x2d, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x09, 0x0a, + 0x00, 0x4c, 0x1d, 0x39, 0x2d, 0x0d, 0x04, 0x0a, 0x26, 0x43, 0x22, 0x22, 0x79, 0x23, 0x43, 0x3f, + 0x3c, 0x5f, 0x3c, 0x02, 0x3c, 0x64, 0x1a, 0x00, 0x79, 0x43, 0x36, 0xb8, 0xff, 0xc0, 0x40, 0x2d, + 0x0d, 0x00, 0x4d, 0x20, 0x36, 0x30, 0x36, 0x50, 0x36, 0x03, 0x36, 0x64, 0x2f, 0x10, 0x01, 0x10, + 0x3f, 0x30, 0x4f, 0x30, 0x5f, 0x30, 0x03, 0x30, 0x79, 0x0a, 0x42, 0x0d, 0x1d, 0x2d, 0x39, 0x2d, + 0x39, 0x2d, 0x33, 0x3f, 0x74, 0x15, 0x03, 0x33, 0x74, 0x05, 0x10, 0x00, 0x10, 0x00, 0x3f, 0x3f, + 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0xed, 0x5d, + 0xd4, 0x5d, 0xed, 0x5d, 0x2b, 0x10, 0xec, 0xd4, 0xed, 0x5d, 0x10, 0xd2, 0xe9, 0x2f, 0x10, 0xc4, + 0x11, 0x17, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x21, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x17, 0x36, 0x37, + 0x17, 0x06, 0x06, 0x07, 0x16, 0x16, 0x17, 0x27, 0x26, 0x26, 0x27, 0x06, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x03, 0x14, 0x16, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, + 0x6d, 0x0b, 0x0d, 0x22, 0x48, 0x23, 0x2d, 0x43, 0x2d, 0x16, 0x31, 0x31, 0x18, 0x1f, 0x1c, 0x2e, + 0x39, 0x1e, 0x1c, 0x36, 0x2a, 0x1a, 0x3a, 0x3e, 0x14, 0x2c, 0x17, 0x0e, 0x01, 0x66, 0x01, 0x1b, + 0x15, 0x18, 0x26, 0x0a, 0xbe, 0x1c, 0x3c, 0x1d, 0x16, 0x1b, 0x23, 0x2a, 0x17, 0x2e, 0x66, 0x12, + 0x10, 0x20, 0x22, 0x19, 0x14, 0x19, 0x1e, 0x1d, 0x18, 0x1e, 0x1f, 0x1c, 0x2f, 0x3e, 0x22, 0x30, + 0x57, 0x1e, 0x21, 0x48, 0x27, 0x28, 0x3d, 0x28, 0x14, 0x12, 0x23, 0x35, 0x23, 0x30, 0x5b, 0x20, + 0x18, 0x32, 0x1a, 0x33, 0x46, 0x0d, 0x38, 0x60, 0x27, 0x21, 0x46, 0x23, 0x7d, 0x23, 0x42, 0x20, + 0x0f, 0x2b, 0x1f, 0x22, 0x32, 0x12, 0x01, 0x77, 0x16, 0x2d, 0x18, 0x12, 0x3b, 0x1b, 0x1a, 0x1b, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xba, 0x01, 0x7c, 0x01, 0x3d, 0x02, 0xa7, 0x00, 0x0d, + 0x00, 0x3d, 0xb6, 0x00, 0x6e, 0x52, 0x0d, 0x01, 0x01, 0x0d, 0xb8, 0xff, 0x80, 0x40, 0x0c, 0x1a, + 0x1d, 0x48, 0x00, 0x0d, 0x01, 0xe0, 0x0d, 0xf0, 0x0d, 0x02, 0x0d, 0xb8, 0xff, 0x80, 0xb3, 0x0e, + 0x16, 0x48, 0x0d, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x0d, 0x48, 0x0d, 0x0e, 0x07, 0x00, 0xa0, 0x00, + 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x2b, 0x2b, 0x5d, 0x71, 0x2b, 0x5f, 0x71, 0xed, 0x31, 0x30, 0x01, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, 0x03, 0x35, 0x35, 0x01, 0x3d, 0x05, 0x09, 0x0a, 0x05, + 0x48, 0x05, 0x0a, 0x09, 0x06, 0x02, 0xa7, 0x42, 0x19, 0x3b, 0x3e, 0x3d, 0x1a, 0x1a, 0x3d, 0x3e, + 0x3b, 0x19, 0x42, 0x00, 0x00, 0x01, 0x00, 0x5e, 0xff, 0x56, 0x01, 0xa1, 0x02, 0xc6, 0x00, 0x0d, + 0x00, 0x1b, 0x40, 0x0c, 0x0b, 0x03, 0x0f, 0x00, 0x70, 0x07, 0x0e, 0x0b, 0x0a, 0x8a, 0x04, 0x12, + 0x00, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xde, 0xc6, 0x31, 0x30, 0x13, 0x14, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0xd0, 0x6d, 0x60, 0x39, 0x88, + 0x7e, 0x82, 0x88, 0x39, 0x60, 0x71, 0x01, 0x0a, 0x7b, 0xb5, 0x38, 0x4c, 0x4b, 0xe0, 0x89, 0x8a, + 0xe7, 0x4b, 0x4c, 0x38, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x55, 0xff, 0x56, 0x01, 0x98, + 0x02, 0xc6, 0x00, 0x0d, 0x00, 0x1b, 0x40, 0x0c, 0x00, 0x70, 0x07, 0x0f, 0x0b, 0x03, 0x0e, 0x0a, + 0x12, 0x03, 0x04, 0x8a, 0x00, 0x3f, 0xc5, 0x3f, 0x01, 0x10, 0xc6, 0x32, 0x10, 0xde, 0xed, 0x31, + 0x30, 0x01, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x01, + 0x26, 0x71, 0x60, 0x39, 0x88, 0x82, 0x7e, 0x88, 0x39, 0x60, 0x6d, 0x01, 0x0a, 0x7c, 0xbc, 0x38, + 0x4c, 0x4b, 0xe7, 0x8a, 0x89, 0xe0, 0x4b, 0x4c, 0x38, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, + 0x00, 0xe4, 0x01, 0xca, 0x02, 0x6b, 0x00, 0x40, 0x00, 0x59, 0x40, 0x11, 0x3c, 0x40, 0x0e, 0x00, + 0x4d, 0x3c, 0x3a, 0x2e, 0x27, 0x00, 0x00, 0x1a, 0x34, 0x22, 0x27, 0x1a, 0x05, 0xb8, 0xff, 0xc0, + 0x40, 0x19, 0x0e, 0x00, 0x4d, 0x05, 0x07, 0x13, 0x1f, 0x0d, 0x1a, 0x1a, 0x41, 0x42, 0x2f, 0x2d, + 0x12, 0x14, 0x1a, 0x3b, 0x06, 0x34, 0x0d, 0x27, 0x1a, 0x20, 0x02, 0x00, 0x3f, 0xdd, 0xc0, 0xdd, + 0xc5, 0xdd, 0xc6, 0x10, 0xd5, 0xcd, 0xd4, 0xcd, 0x01, 0x11, 0x12, 0x39, 0x2f, 0xc5, 0xc5, 0xdd, + 0xc6, 0x32, 0x2b, 0x10, 0xdd, 0xc5, 0xc5, 0x12, 0x39, 0x3d, 0x2f, 0x18, 0x10, 0xdd, 0xc6, 0x32, + 0x2b, 0x31, 0x30, 0x13, 0x0e, 0x03, 0x07, 0x07, 0x27, 0x37, 0x3e, 0x03, 0x37, 0x22, 0x22, 0x26, + 0x26, 0x27, 0x27, 0x37, 0x17, 0x1e, 0x03, 0x17, 0x2e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x14, 0x0e, + 0x02, 0x07, 0x3e, 0x03, 0x37, 0x37, 0x17, 0x07, 0x0e, 0x02, 0x22, 0x23, 0x1e, 0x03, 0x17, 0x17, + 0x07, 0x27, 0x2e, 0x03, 0xfc, 0x03, 0x0c, 0x0d, 0x0f, 0x07, 0x13, 0x5e, 0x13, 0x07, 0x19, 0x1b, + 0x1c, 0x0a, 0x0d, 0x23, 0x24, 0x22, 0x0b, 0x1e, 0x25, 0x1e, 0x0b, 0x1e, 0x1e, 0x1d, 0x0a, 0x04, + 0x0a, 0x09, 0x06, 0x74, 0x06, 0x09, 0x0b, 0x04, 0x0a, 0x1e, 0x1f, 0x1e, 0x0c, 0x1d, 0x24, 0x1e, + 0x0c, 0x22, 0x24, 0x23, 0x0d, 0x0b, 0x1c, 0x1c, 0x18, 0x07, 0x13, 0x5e, 0x12, 0x07, 0x0f, 0x0e, + 0x0b, 0x01, 0x76, 0x0c, 0x22, 0x22, 0x1e, 0x0a, 0x19, 0x43, 0x19, 0x0a, 0x18, 0x18, 0x15, 0x07, + 0x03, 0x06, 0x04, 0x0a, 0x6d, 0x09, 0x04, 0x11, 0x14, 0x14, 0x08, 0x0c, 0x21, 0x24, 0x22, 0x0c, + 0x1f, 0x1f, 0x0c, 0x22, 0x24, 0x21, 0x0c, 0x07, 0x14, 0x13, 0x10, 0x04, 0x0a, 0x6f, 0x09, 0x04, + 0x04, 0x03, 0x07, 0x15, 0x17, 0x18, 0x0a, 0x19, 0x44, 0x19, 0x0a, 0x1e, 0x23, 0x21, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x28, 0x00, 0x26, 0x01, 0xcc, 0x01, 0xe7, 0x00, 0x0b, 0x00, 0x8f, 0xb9, 0x00, + 0x08, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x00, 0x4d, + 0x06, 0x40, 0x0f, 0x00, 0x4d, 0x05, 0x40, 0x0f, 0x00, 0x4d, 0x05, 0x40, 0x09, 0x00, 0x4d, 0x04, + 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x00, + 0xb8, 0xff, 0xc0, 0x40, 0x34, 0x09, 0x00, 0x4d, 0x05, 0x40, 0x15, 0x00, 0x4d, 0x04, 0x40, 0x15, + 0x00, 0x4d, 0x20, 0x06, 0x01, 0x06, 0x04, 0x07, 0x52, 0x01, 0x60, 0x00, 0x01, 0x00, 0x40, 0x0a, + 0x50, 0x0a, 0x80, 0x0a, 0x90, 0x0a, 0x04, 0x0a, 0x0a, 0x0d, 0x0c, 0x0a, 0xcf, 0x08, 0x01, 0x08, + 0x07, 0x55, 0xcf, 0x01, 0x01, 0x01, 0x04, 0x03, 0x0a, 0x00, 0x3f, 0xdd, 0xc0, 0x5d, 0xfd, 0xcd, + 0x5d, 0xc0, 0x01, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x5d, 0x33, 0xfd, 0x32, 0xcd, 0x5d, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x33, 0x35, + 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x28, 0x9d, 0x6a, 0x9d, 0x9d, 0x6a, 0x9d, + 0x01, 0x39, 0xae, 0xae, 0x65, 0xae, 0xae, 0x00, 0x00, 0x01, 0x00, 0x7e, 0xff, 0x67, 0x01, 0x5b, + 0x00, 0xa7, 0x00, 0x13, 0x00, 0x1e, 0x40, 0x0e, 0x0e, 0x7a, 0x08, 0x14, 0x05, 0x00, 0x14, 0x00, + 0x13, 0x0f, 0x0b, 0x7b, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xde, 0xce, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x17, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x7e, 0x12, 0x25, 0x21, 0x1a, 0x08, 0x26, 0x2a, 0x33, 0x27, 0x2a, + 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x49, 0x04, 0x06, 0x0c, 0x16, 0x13, 0x04, 0x34, 0x20, 0x27, 0x32, + 0x38, 0x30, 0x23, 0x46, 0x3c, 0x2c, 0x07, 0x00, 0x00, 0x01, 0x00, 0x71, 0x00, 0xc4, 0x01, 0x83, + 0x01, 0x3d, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x03, 0x01, 0xa1, 0x00, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0xcd, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x71, 0x01, 0x12, 0xfe, 0xee, 0x01, + 0x3d, 0x79, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, 0xff, 0xf5, 0x01, 0x54, 0x00, 0xa7, 0x00, 0x0f, + 0x00, 0x5f, 0xb9, 0x00, 0x0f, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xe0, 0x40, + 0x1f, 0x10, 0x13, 0x48, 0x65, 0x0f, 0x01, 0x0a, 0x20, 0x0e, 0x0f, 0x00, 0x4c, 0x0a, 0x20, 0x10, + 0x13, 0x48, 0x06, 0x20, 0x0e, 0x00, 0x4d, 0x06, 0x20, 0x10, 0x13, 0x48, 0x6a, 0x06, 0x01, 0x01, + 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xe0, 0x40, 0x0f, 0x10, 0x13, 0x48, + 0x65, 0x01, 0x01, 0x11, 0x00, 0x7a, 0x08, 0x10, 0x0d, 0x7b, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xfd, 0xce, 0x31, 0x30, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, + 0x2b, 0x25, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x01, + 0x54, 0x36, 0x23, 0x12, 0x20, 0x19, 0x0f, 0x0f, 0x19, 0x20, 0x12, 0x23, 0x36, 0x4f, 0x2c, 0x2e, + 0x0c, 0x17, 0x21, 0x16, 0x15, 0x21, 0x16, 0x0c, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, + 0xff, 0x5b, 0x01, 0xc5, 0x02, 0xbb, 0x00, 0x03, 0x00, 0x2d, 0x40, 0x15, 0x02, 0x01, 0x00, 0x03, + 0x02, 0x03, 0x00, 0x76, 0x01, 0x02, 0x14, 0x01, 0x02, 0x00, 0x01, 0x04, 0x03, 0x03, 0x10, 0x01, + 0x12, 0x00, 0x3f, 0x3f, 0x01, 0x2f, 0x10, 0xd2, 0x00, 0xc1, 0x87, 0x05, 0x2b, 0x10, 0x00, 0xc1, + 0x87, 0x05, 0x7d, 0x10, 0xc4, 0x31, 0x30, 0x17, 0x23, 0x01, 0x33, 0xaf, 0x80, 0x01, 0x18, 0x7e, + 0xa5, 0x03, 0x60, 0x00, 0x00, 0x03, 0x00, 0x23, 0xff, 0xf3, 0x01, 0xd1, 0x02, 0x79, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x23, 0x00, 0x55, 0x40, 0x34, 0xef, 0x1e, 0xff, 0x1e, 0x02, 0xd1, 0x1e, 0x01, + 0xc0, 0x1e, 0x01, 0x8f, 0x1e, 0x9f, 0x1e, 0x02, 0x1e, 0x64, 0x18, 0x18, 0x06, 0x00, 0x0c, 0x0c, + 0x64, 0x00, 0x25, 0x12, 0x64, 0x06, 0x24, 0xb1, 0x21, 0x01, 0xa0, 0x21, 0x01, 0x21, 0x40, 0x1b, + 0x01, 0x1b, 0x1b, 0x15, 0x0f, 0x65, 0x09, 0x05, 0x15, 0x65, 0x03, 0x0d, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x5d, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xda, 0xe9, 0x2f, + 0x11, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x5d, 0x5d, 0x5d, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, + 0xd1, 0x6e, 0x69, 0x69, 0x6e, 0x70, 0x67, 0x69, 0x6e, 0x6f, 0x35, 0x33, 0x32, 0x36, 0x36, 0x32, + 0x33, 0x35, 0x30, 0x1f, 0x18, 0x1a, 0x1e, 0x1e, 0x1a, 0x18, 0x1f, 0x01, 0x37, 0xa4, 0xa0, 0xa0, + 0xa4, 0xa2, 0xa0, 0x9f, 0xa3, 0x6a, 0x6f, 0x6f, 0x6a, 0x6b, 0x6f, 0x6f, 0x75, 0x1b, 0x27, 0x27, + 0x1b, 0x1b, 0x28, 0x28, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x01, 0xcb, 0x02, 0x6b, 0x00, 0x10, + 0x00, 0x2f, 0x40, 0x1a, 0x0e, 0x40, 0x0c, 0x00, 0x4d, 0x10, 0x0a, 0x05, 0x01, 0x61, 0x0c, 0x0d, + 0x12, 0x04, 0x01, 0x05, 0x03, 0x0a, 0x0c, 0x65, 0x00, 0x65, 0x0e, 0x0c, 0x0a, 0x04, 0x00, 0x3f, + 0x3f, 0xed, 0xed, 0x11, 0x17, 0x39, 0x01, 0x10, 0xde, 0xdd, 0xfd, 0xcd, 0x33, 0xce, 0x31, 0x30, + 0x2b, 0x37, 0x11, 0x06, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x35, + 0xd5, 0x1c, 0x48, 0x19, 0x28, 0x18, 0x38, 0x38, 0x32, 0x12, 0x54, 0x7b, 0xfe, 0x88, 0x66, 0x01, + 0x5a, 0x14, 0x1f, 0x09, 0x66, 0x09, 0x1c, 0x22, 0x26, 0x14, 0xfd, 0xfb, 0x66, 0x66, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2b, 0x00, 0x00, 0x01, 0xce, 0x02, 0x79, 0x00, 0x25, 0x00, 0x26, 0x40, 0x13, + 0x17, 0x63, 0x00, 0x0b, 0x27, 0x1e, 0x0a, 0x63, 0x10, 0x26, 0x1d, 0x1a, 0x67, 0x21, 0x05, 0x0a, + 0x65, 0x0c, 0x0c, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xed, 0xc6, 0x10, 0xde, + 0xd6, 0xed, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x21, 0x15, 0x21, 0x26, + 0x36, 0x35, 0x34, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x01, 0xb2, 0x18, 0x28, 0x32, 0x1a, 0x0d, 0x22, 0x1e, 0x15, 0x01, 0x0a, 0xfe, + 0x6c, 0x03, 0x01, 0x25, 0x39, 0x41, 0x39, 0x25, 0x2e, 0x23, 0x1d, 0x40, 0x1f, 0x3d, 0x28, 0x69, + 0x34, 0x26, 0x46, 0x36, 0x20, 0x01, 0xc8, 0x20, 0x3b, 0x38, 0x34, 0x18, 0x0c, 0x21, 0x23, 0x24, + 0x0f, 0x66, 0x0a, 0x1e, 0x06, 0x32, 0x54, 0x47, 0x3d, 0x38, 0x34, 0x1b, 0x26, 0x29, 0x1c, 0x21, + 0x56, 0x2a, 0x28, 0x16, 0x2c, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0xff, 0xf3, 0x01, 0xc3, + 0x02, 0x79, 0x00, 0x30, 0x00, 0x80, 0xb9, 0x00, 0x2d, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x2c, + 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x2b, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x11, + 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xc0, 0x40, 0x2a, 0x0a, 0x00, 0x4d, 0x1d, 0x20, 0x0d, 0x0f, 0x00, 0x4c, 0x29, 0x17, + 0x63, 0x26, 0x2c, 0x10, 0x0c, 0x63, 0x00, 0x2c, 0x01, 0x2c, 0x32, 0x1e, 0x05, 0x31, 0x1d, 0x1a, + 0x67, 0x21, 0x29, 0x29, 0x0f, 0x65, 0x12, 0x12, 0x21, 0x05, 0x06, 0x09, 0x67, 0x00, 0x0d, 0x00, + 0x3f, 0xed, 0x32, 0x3f, 0x39, 0x2f, 0xed, 0x39, 0x3d, 0x2f, 0x18, 0x10, 0xed, 0x32, 0x01, 0x10, + 0xd6, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0xce, 0x10, 0xd4, 0xed, 0x33, 0x31, 0x30, 0x00, 0x2b, 0x01, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, + 0x14, 0x0e, 0x02, 0xd5, 0x17, 0x33, 0x2f, 0x28, 0x0b, 0x18, 0x17, 0x49, 0x33, 0x3f, 0x33, 0x4e, + 0x3c, 0x26, 0x2e, 0x13, 0x26, 0x1e, 0x13, 0x29, 0x24, 0x23, 0x45, 0x19, 0x2c, 0x1b, 0x59, 0x38, + 0x34, 0x4d, 0x32, 0x18, 0x2a, 0x23, 0x30, 0x35, 0x1c, 0x3a, 0x5a, 0x0d, 0x07, 0x0a, 0x0c, 0x05, + 0x67, 0x0a, 0x16, 0x36, 0x28, 0x31, 0x27, 0x66, 0x08, 0x12, 0x1e, 0x17, 0x22, 0x27, 0x17, 0x11, + 0x5a, 0x12, 0x25, 0x1a, 0x2f, 0x40, 0x25, 0x25, 0x44, 0x12, 0x14, 0x4e, 0x36, 0x2b, 0x48, 0x35, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x06, + 0x00, 0x15, 0x00, 0x30, 0x40, 0x17, 0x0b, 0x09, 0x08, 0x61, 0x15, 0x0e, 0x06, 0x05, 0x0f, 0x16, + 0x10, 0x06, 0x08, 0x65, 0x0e, 0x00, 0x0b, 0x0b, 0x07, 0x0d, 0x0c, 0x07, 0x04, 0x00, 0x3f, 0x3f, + 0x12, 0x39, 0x2f, 0x39, 0x33, 0xed, 0x32, 0x32, 0x01, 0x10, 0xd6, 0x32, 0xdd, 0x32, 0x32, 0xfd, + 0xcd, 0x33, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x33, 0x13, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, + 0x35, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x01, 0x1d, 0x12, 0x26, 0x25, 0x22, 0x0d, 0x8c, 0x7b, 0x43, + 0x43, 0x7b, 0xfe, 0xfe, 0x13, 0x3c, 0x48, 0x50, 0x28, 0x01, 0xd1, 0x17, 0x34, 0x39, 0x3a, 0x1c, + 0x01, 0x74, 0xfe, 0x8c, 0x65, 0x92, 0x92, 0x5a, 0x27, 0x63, 0x68, 0x65, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x23, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0x6b, 0x00, 0x23, 0x00, 0x3c, 0x40, 0x22, + 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x0a, 0x40, 0x0d, 0x00, 0x4d, 0x0a, 0x00, 0x63, 0x11, 0x25, 0x0b, + 0x61, 0x05, 0x1b, 0x24, 0x1c, 0x1f, 0x67, 0x16, 0x0e, 0x65, 0x05, 0x05, 0x16, 0x0d, 0x0b, 0x65, + 0x09, 0x04, 0x00, 0x3f, 0xed, 0x3f, 0x39, 0x2f, 0xed, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xd6, + 0xed, 0x10, 0xde, 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x25, 0x34, 0x2e, 0x02, 0x23, 0x36, + 0x36, 0x37, 0x21, 0x15, 0x23, 0x06, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x01, 0x41, 0x11, 0x33, 0x5e, 0x4c, + 0x0a, 0x0c, 0x03, 0x01, 0x3c, 0xd5, 0x02, 0x06, 0x02, 0x7c, 0x7a, 0x1e, 0x3e, 0x5c, 0x3d, 0x18, + 0x32, 0x2e, 0x25, 0x0a, 0x19, 0x16, 0x44, 0x33, 0x24, 0x2f, 0x1b, 0x0a, 0xb6, 0x1a, 0x2b, 0x1f, + 0x11, 0x54, 0xa1, 0x4b, 0x66, 0x20, 0x46, 0x16, 0x08, 0x68, 0x5e, 0x2b, 0x49, 0x36, 0x1e, 0x06, + 0x09, 0x0c, 0x05, 0x66, 0x0b, 0x12, 0x10, 0x19, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2e, + 0xff, 0xf3, 0x01, 0xc7, 0x02, 0x6f, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x3e, 0x40, 0x0f, 0x26, 0x10, + 0x63, 0x60, 0x18, 0x70, 0x18, 0x02, 0x18, 0x2f, 0x2b, 0x63, 0x03, 0x63, 0x20, 0xb8, 0xff, 0xc0, + 0x40, 0x12, 0x0b, 0x10, 0x48, 0x20, 0x2e, 0x00, 0x65, 0x13, 0x13, 0x1d, 0x26, 0x67, 0x25, 0x04, + 0x0b, 0x67, 0x1d, 0x0d, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x10, 0xed, 0x01, 0x10, 0xd6, + 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, 0xed, 0xc4, 0x31, 0x30, 0x13, 0x22, 0x06, 0x07, 0x06, 0x06, + 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x17, 0x0e, 0x03, 0x07, 0x36, + 0x36, 0xf1, 0x13, 0x28, 0x0d, 0x01, 0x01, 0x08, 0x14, 0x23, 0x1a, 0x15, 0x1e, 0x13, 0x09, 0x2a, + 0x24, 0x36, 0x4b, 0x30, 0x15, 0x17, 0x30, 0x4a, 0x33, 0x68, 0x6d, 0x35, 0x62, 0x8a, 0x54, 0x07, + 0x28, 0x4c, 0x40, 0x2f, 0x0b, 0x13, 0x24, 0x01, 0x26, 0x08, 0x07, 0x09, 0x12, 0x0a, 0x1d, 0x35, + 0x2a, 0x19, 0x14, 0x1e, 0x24, 0x11, 0x2f, 0x33, 0x66, 0x20, 0x36, 0x48, 0x28, 0x24, 0x4a, 0x3e, + 0x27, 0x81, 0x89, 0x5a, 0x8a, 0x5e, 0x30, 0x69, 0x01, 0x0e, 0x21, 0x34, 0x27, 0x08, 0x09, 0x00, + 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x01, 0xc5, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x29, 0xb6, 0x00, + 0x61, 0x0e, 0x09, 0x63, 0x05, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x0b, 0x10, 0x48, 0x07, 0x0f, + 0x09, 0x65, 0x05, 0x65, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x3f, 0x3f, 0xed, 0xed, 0x01, 0x10, 0xd6, + 0x2b, 0xdd, 0xfd, 0xde, 0xed, 0x31, 0x30, 0x33, 0x3e, 0x03, 0x37, 0x21, 0x35, 0x21, 0x15, 0x0e, + 0x03, 0x07, 0x84, 0x03, 0x24, 0x33, 0x3c, 0x1b, 0xfe, 0xfc, 0x01, 0x94, 0x1b, 0x40, 0x39, 0x2b, + 0x05, 0x40, 0x8f, 0x8c, 0x7d, 0x2d, 0x66, 0x5d, 0x1f, 0x70, 0x8e, 0xa1, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x26, 0xff, 0xf3, 0x01, 0xcf, 0x02, 0x7a, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x37, + 0x00, 0xfd, 0xb5, 0x36, 0x40, 0x0c, 0x00, 0x4d, 0x34, 0xb8, 0xff, 0x80, 0xb3, 0x0c, 0x00, 0x4d, + 0x32, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x30, 0x40, 0x0c, 0x00, 0x4d, 0x2f, 0xb8, + 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xe0, 0xb3, 0x0b, 0x00, 0x4d, 0x2e, 0xb8, + 0xff, 0xc0, 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x2c, 0xb8, 0xff, 0xc0, 0xb6, 0x0b, 0x00, 0x4d, 0x20, + 0x2c, 0x01, 0x19, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x18, 0xb8, 0xff, 0xe0, 0x40, 0x0e, + 0x09, 0x00, 0x4d, 0x09, 0x40, 0x0a, 0x00, 0x4d, 0x09, 0x20, 0x09, 0x00, 0x4d, 0x35, 0xb8, 0xff, + 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x23, 0xb8, + 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x23, 0xb8, 0xff, 0xc0, 0xb6, 0x0a, 0x00, 0x4d, 0x00, 0x23, + 0x01, 0x22, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0a, 0x00, 0x4d, 0x00, 0x22, 0x01, 0x03, 0x32, 0x23, + 0x13, 0x04, 0x10, 0x1e, 0x64, 0x06, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x06, 0xb8, 0xff, + 0xc0, 0x40, 0x26, 0x0a, 0x0d, 0x48, 0x06, 0x39, 0x35, 0x64, 0x00, 0x00, 0x01, 0x00, 0x39, 0x2f, + 0x2f, 0x64, 0x16, 0x26, 0x64, 0x50, 0x10, 0x01, 0x10, 0x38, 0x32, 0x03, 0x13, 0x03, 0x23, 0x23, + 0x29, 0x2c, 0x67, 0x1b, 0x05, 0x29, 0x67, 0x0b, 0x0d, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, + 0x2f, 0x17, 0x39, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd0, 0xe9, 0x2f, 0x10, 0xd6, 0x5d, 0xed, 0x10, + 0xd6, 0x2b, 0x2b, 0xed, 0x12, 0x17, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, + 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x03, 0x34, 0x2e, 0x02, 0x27, 0x06, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x01, 0xbe, 0x2a, 0x2d, 0x39, 0x2f, 0x17, 0x33, 0x52, 0x3c, 0x2f, 0x4d, 0x37, + 0x1e, 0x2c, 0x2f, 0x2c, 0x20, 0x15, 0x2e, 0x4c, 0x38, 0x59, 0x69, 0x63, 0x0f, 0x21, 0x34, 0x24, + 0x1c, 0x1e, 0x39, 0x27, 0x2d, 0x35, 0x61, 0x20, 0x31, 0x2e, 0x3a, 0x1f, 0x1a, 0x2f, 0x01, 0xd8, + 0x2b, 0x53, 0x1c, 0x21, 0x4e, 0x2f, 0x1e, 0x3e, 0x31, 0x20, 0x17, 0x2b, 0x3f, 0x27, 0x2f, 0x53, + 0x20, 0x1e, 0x44, 0x26, 0x1e, 0x41, 0x34, 0x22, 0x58, 0xfe, 0x80, 0x14, 0x1e, 0x19, 0x19, 0x0e, + 0x17, 0x39, 0x1a, 0x28, 0x29, 0x2b, 0x01, 0x90, 0x24, 0x23, 0x23, 0x2c, 0x18, 0x17, 0x37, 0x1a, + 0x23, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2d, 0xff, 0xfe, 0x01, 0xc9, 0x02, 0x7b, 0x00, 0x12, + 0x00, 0x2a, 0x00, 0x40, 0x40, 0x25, 0x29, 0x29, 0x63, 0x20, 0x03, 0x03, 0x63, 0x40, 0x20, 0x01, + 0x20, 0x2c, 0x26, 0x10, 0x63, 0x20, 0x18, 0x30, 0x18, 0x40, 0x18, 0x03, 0x18, 0x2b, 0x00, 0x65, + 0x13, 0x13, 0x1d, 0x26, 0x67, 0x25, 0x0c, 0x0b, 0x67, 0x1d, 0x05, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x12, 0x39, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xc4, 0x10, 0xda, 0x5d, 0xe9, 0x2f, 0x10, + 0xe9, 0x2f, 0x31, 0x30, 0x01, 0x32, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x16, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x27, 0x36, 0x36, 0x37, 0x06, 0x01, 0x05, 0x13, 0x2a, 0x0d, 0x01, + 0x01, 0x09, 0x15, 0x23, 0x1a, 0x16, 0x1f, 0x13, 0x09, 0x2c, 0x24, 0x36, 0x4c, 0x30, 0x16, 0x19, + 0x31, 0x4a, 0x32, 0x68, 0x6e, 0x34, 0x61, 0x89, 0x54, 0x04, 0x50, 0x7e, 0x1a, 0x27, 0x01, 0x49, + 0x08, 0x07, 0x08, 0x17, 0x0b, 0x19, 0x33, 0x2a, 0x1a, 0x11, 0x1c, 0x26, 0x15, 0x2f, 0x32, 0x66, + 0x1f, 0x36, 0x47, 0x29, 0x24, 0x4b, 0x3d, 0x27, 0x8c, 0x7d, 0x5a, 0x8b, 0x5e, 0x31, 0x6a, 0x01, + 0x43, 0x48, 0x11, 0x00, 0xff, 0xff, 0x00, 0xa1, 0xff, 0xf5, 0x01, 0x54, 0x01, 0xd6, 0x02, 0x26, + 0x00, 0x11, 0x00, 0x00, 0x01, 0x07, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2f, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x17, 0x10, 0x07, 0x00, 0x50, 0x01, 0x0c, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x76, 0xff, 0x67, 0x01, 0x54, 0x01, 0xd6, 0x02, 0x36, 0x00, 0x0f, 0xf8, 0x00, + 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2f, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x28, 0x01, 0xcf, + 0x01, 0xda, 0x00, 0x06, 0x00, 0x2a, 0x40, 0x12, 0x03, 0x06, 0x02, 0x04, 0x08, 0x06, 0x07, 0x06, + 0x05, 0x00, 0x02, 0x03, 0x03, 0x01, 0x05, 0x10, 0x01, 0x10, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, + 0x2f, 0x39, 0x39, 0x12, 0x39, 0x01, 0x10, 0xc2, 0x18, 0x10, 0xde, 0xc0, 0x12, 0x39, 0x31, 0x30, + 0x13, 0x25, 0x17, 0x05, 0x05, 0x07, 0x25, 0x2d, 0x01, 0x80, 0x22, 0xfe, 0xe8, 0x01, 0x18, 0x22, + 0xfe, 0x80, 0x01, 0x39, 0xa1, 0x6c, 0x6d, 0x6d, 0x6c, 0xa2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, + 0x00, 0x72, 0x01, 0xcc, 0x01, 0x9b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x21, 0x40, 0x0f, 0x02, 0x01, + 0x06, 0x05, 0x09, 0x03, 0x07, 0x08, 0x07, 0x55, 0x04, 0x03, 0x55, 0x00, 0xa3, 0x00, 0x3f, 0xfd, + 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xc0, 0x10, 0xde, 0x32, 0xc0, 0x32, 0x31, 0x30, 0x13, 0x21, 0x15, + 0x21, 0x15, 0x21, 0x15, 0x21, 0x28, 0x01, 0xa4, 0xfe, 0x5c, 0x01, 0xa4, 0xfe, 0x5c, 0x01, 0x9b, + 0x66, 0x5d, 0x66, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x27, 0x01, 0xcb, 0x01, 0xd9, 0x00, 0x06, + 0x00, 0x2e, 0x40, 0x14, 0x03, 0x02, 0x00, 0x08, 0x04, 0x02, 0x07, 0x02, 0x00, 0x01, 0x06, 0x04, + 0x05, 0x03, 0x03, 0x01, 0x05, 0x10, 0x01, 0x10, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, 0x2f, 0x12, + 0x39, 0x39, 0x12, 0x39, 0x39, 0x01, 0x18, 0x10, 0xd6, 0xc0, 0x10, 0xce, 0x11, 0x39, 0x31, 0x30, + 0x25, 0x05, 0x27, 0x25, 0x25, 0x37, 0x05, 0x01, 0xcb, 0xfe, 0x80, 0x23, 0x01, 0x19, 0xfe, 0xe7, + 0x23, 0x01, 0x80, 0xc9, 0xa2, 0x6c, 0x6d, 0x6d, 0x6c, 0xa1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, + 0xff, 0xf4, 0x01, 0xb2, 0x02, 0x79, 0x00, 0x1e, 0x00, 0x30, 0x00, 0x31, 0x40, 0x1a, 0x00, 0x1e, + 0x32, 0x08, 0x17, 0x32, 0x1f, 0x71, 0x0f, 0x27, 0x1f, 0x27, 0x02, 0x27, 0x0f, 0x31, 0x1e, 0x2c, + 0x75, 0x22, 0x07, 0x0e, 0x0b, 0x67, 0x12, 0x03, 0x00, 0x3f, 0xfd, 0xc2, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xc6, 0xde, 0x5d, 0xed, 0x10, 0xde, 0xc5, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x37, 0x26, 0x35, + 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x04, 0x15, 0x17, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0xa6, 0x01, 0x2a, 0x22, 0x17, 0x28, 0x2a, 0x20, 0x20, + 0x3c, 0x23, 0x22, 0x23, 0x5e, 0x2e, 0x39, 0x4a, 0x2a, 0x11, 0x17, 0x23, 0x28, 0x23, 0x17, 0x23, + 0x33, 0x20, 0x10, 0x1e, 0x18, 0x0e, 0x0e, 0x18, 0x1e, 0x10, 0x10, 0x1e, 0x17, 0x0e, 0xe1, 0x05, + 0x0a, 0x28, 0x49, 0x1c, 0x13, 0x2b, 0x19, 0x1e, 0x1f, 0x13, 0x11, 0x5e, 0x16, 0x18, 0x1f, 0x2e, + 0x37, 0x19, 0x1d, 0x30, 0x2a, 0x25, 0x24, 0x26, 0x15, 0x9a, 0x27, 0x2c, 0x0b, 0x16, 0x1e, 0x14, + 0x13, 0x1f, 0x15, 0x0b, 0x0b, 0x15, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0x79, 0x01, 0xd4, + 0x02, 0x79, 0x00, 0x35, 0x00, 0x45, 0x01, 0x5a, 0xb9, 0x00, 0x3e, 0xff, 0xc0, 0xb3, 0x0e, 0x00, + 0x4d, 0x38, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0f, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x21, + 0x38, 0x0d, 0x00, 0x4d, 0x20, 0x40, 0x0d, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xe0, 0xb3, 0x0a, 0x00, + 0x4d, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0e, 0x00, 0x4d, 0x3a, 0x20, 0x0a, 0x00, 0x4d, 0x3a, + 0x40, 0x09, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xc0, 0x40, 0x1b, 0x09, 0x00, 0x4d, 0x9f, 0x20, 0x01, + 0x1f, 0x40, 0x12, 0x00, 0x4d, 0x1e, 0x40, 0x12, 0x00, 0x4d, 0x1d, 0x40, 0x12, 0x00, 0x4d, 0x1c, + 0x20, 0x12, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0xb3, 0x11, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, + 0x40, 0x0a, 0x09, 0x00, 0x4d, 0x16, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xe0, 0xb4, + 0x11, 0x12, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, + 0xb3, 0x10, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb4, 0x10, 0x12, 0x00, 0x4c, 0x12, 0xb8, 0xff, + 0xe0, 0x40, 0x72, 0x10, 0x12, 0x00, 0x4c, 0x05, 0x40, 0x09, 0x00, 0x4d, 0x04, 0x40, 0x09, 0x00, + 0x4d, 0x03, 0x40, 0x09, 0x00, 0x4d, 0x02, 0x40, 0x09, 0x00, 0x4d, 0x01, 0x20, 0x09, 0x00, 0x4d, + 0x00, 0x20, 0x09, 0x00, 0x4d, 0x50, 0x3d, 0x01, 0x3d, 0x0f, 0x40, 0x3e, 0x01, 0x3e, 0x79, 0x20, + 0x35, 0x30, 0x35, 0x60, 0x35, 0x03, 0x35, 0x47, 0x4f, 0x36, 0x5f, 0x36, 0x02, 0x36, 0x79, 0x08, + 0x08, 0x2b, 0x21, 0x47, 0x8f, 0x18, 0x9f, 0x18, 0x02, 0x18, 0x7c, 0x2b, 0x46, 0x40, 0x03, 0x50, + 0x03, 0x02, 0x1f, 0x03, 0x01, 0x03, 0x79, 0x3d, 0x40, 0x41, 0x50, 0x41, 0x02, 0x41, 0x79, 0x0d, + 0x00, 0x26, 0x3e, 0x0f, 0x0d, 0x3d, 0x0d, 0x3d, 0x0d, 0x26, 0x13, 0x7d, 0x30, 0x03, 0x20, 0x8f, + 0x1d, 0x01, 0x1d, 0x7d, 0x26, 0x00, 0x2f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x2f, + 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x5d, 0x01, 0x10, 0xd6, + 0xed, 0x5d, 0x10, 0xc6, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0x32, + 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x25, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x17, + 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x07, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x01, 0xd4, 0x1b, + 0x47, 0x1a, 0x26, 0x41, 0x30, 0x1b, 0x0f, 0x24, 0x39, 0x2a, 0x13, 0x1c, 0x30, 0x2e, 0x21, 0x3b, + 0x2b, 0x19, 0x15, 0x33, 0x55, 0x3f, 0x2f, 0x36, 0x08, 0x0b, 0x11, 0x1c, 0x1c, 0x1d, 0x12, 0x42, + 0x72, 0x53, 0x30, 0x29, 0x46, 0x5a, 0x32, 0x29, 0x48, 0x36, 0x20, 0xc5, 0x05, 0x0e, 0x19, 0x14, + 0x0d, 0x0f, 0x08, 0x0e, 0x07, 0x13, 0x18, 0x0e, 0x06, 0x37, 0x0b, 0x0b, 0x17, 0x31, 0x4f, 0x39, + 0x2a, 0x4a, 0x37, 0x20, 0x05, 0x10, 0x26, 0x35, 0x1c, 0x46, 0x75, 0x59, 0x46, 0x6c, 0x49, 0x26, + 0x0a, 0x03, 0x57, 0x04, 0x05, 0x03, 0x02, 0x24, 0x59, 0x93, 0x6f, 0x6c, 0x93, 0x5b, 0x27, 0x19, + 0x36, 0x57, 0x3e, 0x9e, 0x13, 0x28, 0x20, 0x15, 0x03, 0xc8, 0x02, 0x02, 0x11, 0x1b, 0x22, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x44, + 0xb9, 0x00, 0x0a, 0xff, 0xe0, 0x40, 0x27, 0x09, 0x0a, 0x00, 0x4c, 0x05, 0x20, 0x09, 0x0a, 0x00, + 0x4c, 0x00, 0x01, 0x08, 0x12, 0x0c, 0x11, 0x07, 0x02, 0x03, 0x09, 0x17, 0x0b, 0x18, 0x04, 0x17, + 0x12, 0x48, 0x0c, 0x08, 0x01, 0x01, 0x08, 0x02, 0x07, 0x02, 0x03, 0x08, 0x00, 0x08, 0x00, 0x3f, + 0x3f, 0x3f, 0x3f, 0x39, 0x2f, 0x12, 0x39, 0xed, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, + 0x31, 0x30, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, + 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x01, 0x67, 0x1d, 0xa5, 0x1c, 0x80, 0x2c, 0x5a, 0x2a, + 0x86, 0x2c, 0x57, 0x29, 0xf2, 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x8f, + 0x8f, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, 0xb2, 0x01, 0xf3, 0x23, 0x3f, 0x3d, 0x3e, 0x21, + 0x21, 0x3e, 0x3d, 0x3f, 0x00, 0x03, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x72, 0x00, 0x16, + 0x00, 0x23, 0x00, 0x30, 0x00, 0x54, 0x40, 0x15, 0x27, 0x46, 0x11, 0x20, 0x46, 0x70, 0x00, 0x80, + 0x00, 0x02, 0x0f, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x32, 0x17, 0x30, 0x44, 0x09, 0xb8, 0xff, 0xc0, + 0x40, 0x1a, 0x0a, 0x10, 0x48, 0x0f, 0x09, 0x1f, 0x09, 0x02, 0x08, 0x09, 0x31, 0x14, 0x14, 0x23, + 0x48, 0x24, 0x24, 0x1b, 0x2c, 0x4a, 0x0c, 0x03, 0x1b, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0xed, 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, 0xd6, 0x5e, 0x5d, 0x2b, 0xed, + 0x32, 0x10, 0xde, 0x5d, 0x5d, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x25, + 0x15, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x15, 0x01, 0xd5, 0x26, 0x41, 0x59, 0x33, 0x29, 0x58, 0x2b, + 0x23, 0x54, 0x29, 0x46, 0x58, 0x32, 0x12, 0x2b, 0x24, 0x3f, 0x2d, 0xfe, 0xdc, 0x0d, 0x1f, 0x0f, + 0x15, 0x28, 0x1f, 0x14, 0x39, 0x30, 0x12, 0x2f, 0x30, 0x0e, 0x18, 0x20, 0x11, 0x0e, 0x1e, 0x0c, + 0xbb, 0x38, 0x4b, 0x2d, 0x13, 0x09, 0x09, 0x02, 0x59, 0x06, 0x09, 0x1d, 0x2f, 0x3a, 0x1d, 0x2c, + 0x44, 0x14, 0x17, 0x4e, 0x29, 0xa8, 0x02, 0x02, 0x07, 0x13, 0x23, 0x1b, 0x2d, 0x27, 0x66, 0x29, + 0x24, 0x16, 0x1b, 0x0f, 0x05, 0x02, 0x02, 0x8e, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, + 0x02, 0x79, 0x00, 0x1f, 0x00, 0x3a, 0xb6, 0x0e, 0x60, 0x0d, 0x01, 0x0d, 0x1c, 0x1d, 0xb8, 0xff, + 0xc0, 0x40, 0x17, 0x08, 0x0f, 0x48, 0x1d, 0x21, 0x16, 0x46, 0x03, 0x20, 0x0e, 0x4a, 0x0d, 0x11, + 0x4a, 0x08, 0x03, 0x1c, 0x4a, 0x1d, 0x19, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0xd5, 0xed, 0x3f, + 0xed, 0xd5, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0x2b, 0x32, 0xc6, 0x5d, 0x32, 0x31, 0x30, + 0x05, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, 0x23, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x01, 0x28, 0x83, + 0x8a, 0x2a, 0x4b, 0x67, 0x3d, 0x21, 0x35, 0x28, 0x1b, 0x07, 0x20, 0x17, 0x41, 0x2a, 0x1d, 0x37, + 0x2b, 0x1b, 0x49, 0x53, 0x30, 0x3f, 0x13, 0x1f, 0x1a, 0x59, 0x0d, 0xa8, 0x9b, 0x4d, 0x78, 0x53, + 0x2b, 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0f, 0x15, 0x15, 0x31, 0x52, 0x3d, 0x6a, 0x71, 0x16, 0x0b, + 0x61, 0x10, 0x1b, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd9, 0x02, 0x72, 0x00, 0x10, + 0x00, 0x21, 0x00, 0x36, 0x40, 0x0a, 0x08, 0x46, 0x0f, 0x11, 0x01, 0x11, 0x23, 0x10, 0x44, 0x1a, + 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x0a, 0x10, 0x48, 0x0f, 0x1a, 0x01, 0x08, 0x1a, 0x22, 0x0d, 0x48, + 0x1d, 0x02, 0x03, 0x48, 0x16, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5e, 0x5d, + 0x2b, 0xed, 0x7d, 0x2f, 0x18, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x37, 0x16, 0x32, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x05, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0xb1, 0x05, 0x0c, 0x05, 0x2a, 0x39, 0x23, 0x0f, + 0x0c, 0x1e, 0x34, 0x29, 0x08, 0x14, 0x08, 0x01, 0x28, 0x2b, 0x4c, 0x69, 0x3f, 0x21, 0x3f, 0x24, + 0x2a, 0x4a, 0x20, 0x3d, 0x65, 0x46, 0x27, 0x64, 0x01, 0x20, 0x38, 0x4d, 0x2e, 0x28, 0x4c, 0x3a, + 0x23, 0x01, 0x02, 0xce, 0x56, 0x79, 0x4c, 0x23, 0x07, 0x08, 0x02, 0x5c, 0x09, 0x06, 0x24, 0x4d, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x51, 0x40, 0x1b, 0x07, 0x02, 0x20, 0x0a, 0x30, 0x0a, 0x02, 0x0a, 0x0d, 0x09, 0x04, 0x44, + 0x20, 0x01, 0x30, 0x01, 0x02, 0x01, 0x0c, 0x06, 0x48, 0x08, 0x40, 0x18, 0x00, 0x4d, 0x08, 0xb8, + 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0d, 0x00, 0x4d, 0x08, + 0x08, 0x09, 0x04, 0x48, 0x01, 0x02, 0x09, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, + 0x39, 0x2f, 0x2b, 0x2b, 0x2b, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0x5d, 0xc6, + 0xc6, 0x31, 0x30, 0x33, 0x11, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x15, 0x3f, + 0x01, 0x77, 0xfc, 0xdb, 0xdb, 0x01, 0x12, 0x02, 0x6b, 0x66, 0x8b, 0x66, 0xae, 0x66, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xba, 0x02, 0x6b, 0x00, 0x09, 0x00, 0x4a, 0x40, 0x2f, + 0x02, 0x07, 0x40, 0x09, 0x00, 0x4d, 0x10, 0x07, 0x40, 0x07, 0x80, 0x07, 0x03, 0x0f, 0x07, 0x01, + 0x08, 0x07, 0x0b, 0x08, 0x04, 0x44, 0x01, 0x40, 0x09, 0x00, 0x4d, 0x00, 0x01, 0x30, 0x01, 0x02, + 0x01, 0x0a, 0x08, 0x48, 0x06, 0x06, 0x02, 0x09, 0x08, 0x02, 0x02, 0x03, 0x48, 0x01, 0x02, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xed, 0x32, 0x10, + 0xd6, 0x5e, 0x5d, 0x5d, 0x2b, 0xc4, 0x31, 0x30, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x15, + 0x23, 0x11, 0x3f, 0x01, 0x7b, 0xff, 0x00, 0xe0, 0xe0, 0x02, 0x6b, 0x66, 0x96, 0x66, 0xfe, 0xf7, + 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x02, 0x79, 0x00, 0x23, 0x00, 0x34, 0x40, 0x1c, + 0x20, 0x25, 0x05, 0x46, 0x16, 0x24, 0x0c, 0x44, 0x30, 0x0e, 0x01, 0x0e, 0x0c, 0x0c, 0x0e, 0x20, + 0x02, 0x21, 0x00, 0x4a, 0x1b, 0x03, 0x08, 0x4a, 0x11, 0x09, 0x0e, 0x08, 0x00, 0x3f, 0x3f, 0xed, + 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x2f, 0x01, 0x2f, 0x5d, 0xed, 0x10, 0xd6, 0xed, 0x10, 0xce, + 0x31, 0x30, 0x01, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x33, 0x11, + 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, + 0x26, 0x26, 0x01, 0x38, 0x2c, 0x3c, 0x27, 0x11, 0x46, 0x44, 0x0b, 0x1a, 0x0b, 0x7b, 0x16, 0x5d, + 0x42, 0x3a, 0x5d, 0x42, 0x24, 0x2a, 0x48, 0x62, 0x38, 0x24, 0x39, 0x2a, 0x1b, 0x07, 0x20, 0x16, + 0x40, 0x02, 0x0e, 0x20, 0x39, 0x4f, 0x30, 0x6f, 0x69, 0x02, 0x02, 0xe2, 0xfe, 0xcb, 0x08, 0x14, + 0x29, 0x51, 0x79, 0x50, 0x4f, 0x79, 0x52, 0x29, 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0e, 0x16, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x3b, 0x40, 0x09, + 0x02, 0x0a, 0x44, 0x00, 0x0d, 0x05, 0x09, 0x44, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0b, 0x11, + 0x48, 0x07, 0x0c, 0x0b, 0x02, 0x09, 0x48, 0x40, 0x03, 0x01, 0x03, 0x03, 0x02, 0x08, 0x02, 0x05, + 0x08, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xed, 0x32, 0x10, 0xde, 0xed, 0x32, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, + 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0xc7, 0x7b, 0xa4, 0x7b, 0x7b, 0xa4, 0x02, 0x6b, 0xfd, 0x95, + 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x2e, 0xb6, 0x0b, 0x06, 0x09, 0x44, 0x03, 0x01, 0x05, 0xb8, 0xff, + 0xc0, 0x40, 0x0f, 0x0a, 0x10, 0x48, 0x05, 0x0c, 0x09, 0x02, 0x48, 0x0b, 0x08, 0x03, 0x08, 0x48, + 0x06, 0x02, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0xc0, 0xdd, 0xfd, + 0xdc, 0xc0, 0x31, 0x30, 0x33, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, + 0x36, 0x87, 0x87, 0x01, 0x89, 0x86, 0x86, 0x66, 0x01, 0x9f, 0x66, 0x66, 0xfe, 0x61, 0x66, 0x00, + 0x00, 0x01, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xb6, 0x02, 0x6b, 0x00, 0x13, 0x00, 0x2e, 0x40, 0x19, + 0x12, 0x10, 0x44, 0x0f, 0x00, 0x01, 0x00, 0x15, 0x0f, 0x08, 0x01, 0x08, 0x08, 0x14, 0x13, 0x02, + 0x10, 0x48, 0x12, 0x02, 0x09, 0x0c, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, + 0x01, 0x10, 0xc6, 0x5e, 0x5d, 0x10, 0xde, 0x5d, 0xfd, 0xcd, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x21, 0x01, + 0xb6, 0x17, 0x35, 0x54, 0x3c, 0x3f, 0x54, 0x1d, 0x2f, 0x19, 0x3d, 0x20, 0x30, 0x3b, 0xcf, 0x01, + 0x4b, 0xcf, 0x2d, 0x50, 0x3c, 0x23, 0x20, 0x17, 0x62, 0x10, 0x1e, 0x33, 0x45, 0x01, 0x2f, 0x66, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x00, 0x1a, 0x00, 0x2f, 0x40, 0x19, + 0x0f, 0x44, 0x10, 0x00, 0x44, 0x1a, 0x1c, 0x15, 0x05, 0x0a, 0x44, 0x08, 0x1b, 0x0f, 0x02, 0x0a, + 0x15, 0x05, 0x03, 0x09, 0x02, 0x06, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x17, 0x39, 0x3f, + 0x01, 0x10, 0xd6, 0xfd, 0xc0, 0x33, 0x10, 0xd6, 0xed, 0xd6, 0xed, 0x31, 0x30, 0x21, 0x2e, 0x03, + 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, + 0x01, 0x5e, 0x0b, 0x29, 0x32, 0x37, 0x19, 0x7b, 0x7b, 0x16, 0x30, 0x2b, 0x24, 0x0c, 0x8b, 0x0e, + 0x27, 0x32, 0x39, 0x1f, 0x1f, 0x40, 0x39, 0x2e, 0x0e, 0x23, 0x51, 0x4d, 0x43, 0x17, 0xfe, 0xe5, + 0x02, 0x6b, 0xfe, 0xff, 0x1c, 0x44, 0x44, 0x42, 0x1b, 0x1b, 0x45, 0x4b, 0x4e, 0x24, 0x1e, 0x4e, + 0x59, 0x5d, 0x2c, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x05, + 0x00, 0x2c, 0xb9, 0x00, 0x05, 0xff, 0xc0, 0xb7, 0x09, 0x0f, 0x48, 0x05, 0x07, 0x04, 0x44, 0x02, + 0xb8, 0xff, 0xc0, 0x40, 0x0b, 0x09, 0x0f, 0x48, 0x02, 0x06, 0x02, 0x02, 0x04, 0x48, 0x01, 0x08, + 0x00, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xde, 0x2b, 0xed, 0x10, 0xc6, 0x2b, 0x31, 0x30, 0x21, 0x21, + 0x11, 0x33, 0x11, 0x21, 0x01, 0xcc, 0xfe, 0x7b, 0x7c, 0x01, 0x09, 0x02, 0x6b, 0xfd, 0xfb, 0x00, + 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x00, 0x1c, 0x01, 0x6f, 0xb5, 0x1c, + 0x20, 0x0f, 0x00, 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0b, 0x00, 0x4d, 0x30, 0x16, 0x01, + 0x14, 0x20, 0x0b, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xe0, 0x40, 0x5b, 0x0b, 0x00, 0x4d, 0x12, 0x40, + 0x09, 0x0a, 0x00, 0x4c, 0x3f, 0x12, 0x01, 0x04, 0x12, 0x01, 0x11, 0x40, 0x0b, 0x00, 0x4d, 0x3f, + 0x11, 0x01, 0x0d, 0x20, 0x0e, 0x00, 0x4d, 0x0d, 0x20, 0x09, 0x00, 0x4d, 0x0c, 0x20, 0x0e, 0x12, + 0x00, 0x4c, 0x0c, 0x40, 0x0d, 0x00, 0x4d, 0x0c, 0x20, 0x0c, 0x00, 0x4d, 0x0c, 0x40, 0x0b, 0x00, + 0x4d, 0x0b, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x0b, 0x40, 0x09, 0x0b, 0x00, 0x4c, 0x3f, 0x0b, 0x01, + 0x0a, 0x40, 0x0f, 0x00, 0x4d, 0x07, 0x20, 0x11, 0x12, 0x00, 0x4c, 0x07, 0x20, 0x0e, 0x00, 0x4d, + 0x06, 0x20, 0x11, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xe0, 0x40, 0x1a, 0x0e, 0x00, 0x4d, 0x02, 0x40, + 0x0a, 0x00, 0x4d, 0x02, 0x20, 0x09, 0x00, 0x4d, 0x01, 0x20, 0x0f, 0x12, 0x00, 0x4c, 0x00, 0x40, + 0x09, 0x0a, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x0b, 0x00, 0x4d, 0x10, 0x15, 0x01, + 0x14, 0x40, 0x0c, 0x00, 0x4d, 0x14, 0x20, 0x0b, 0x00, 0x4d, 0x13, 0x20, 0x0b, 0x00, 0x4d, 0x3f, + 0x13, 0x01, 0x12, 0xb8, 0xff, 0x80, 0xb3, 0x0d, 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x31, + 0x0b, 0x00, 0x4d, 0x0f, 0x12, 0x01, 0x06, 0x40, 0x0a, 0x00, 0x4d, 0x05, 0x40, 0x0a, 0x00, 0x4d, + 0x2f, 0x05, 0x3f, 0x05, 0x02, 0x04, 0x40, 0x0a, 0x00, 0x4d, 0x0a, 0x0a, 0x0b, 0x10, 0x15, 0x14, + 0x17, 0x13, 0x12, 0x10, 0x05, 0x05, 0x17, 0x11, 0x44, 0x10, 0x1e, 0x00, 0x00, 0x1c, 0x16, 0x44, + 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x1e, 0x0f, 0x00, 0x4d, 0x6f, 0x17, 0x01, 0x00, 0x17, 0x10, 0x17, + 0x02, 0x17, 0x1d, 0x15, 0x1c, 0x14, 0x14, 0x16, 0x1c, 0x02, 0x16, 0x08, 0x12, 0x13, 0x13, 0x0b, + 0x11, 0x08, 0x0b, 0x02, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x3f, 0x3f, 0x12, 0x39, 0x2f, + 0x12, 0x39, 0x01, 0x7c, 0x10, 0xde, 0x5d, 0x5d, 0x2b, 0x18, 0xed, 0xd1, 0xc9, 0x2f, 0x10, 0xd6, + 0xed, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x10, 0xd9, 0xc9, 0x18, 0x2f, + 0x31, 0x30, 0x00, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x5d, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x13, 0x1e, 0x03, + 0x17, 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x23, 0x13, 0x03, 0x23, 0x03, 0x13, 0x23, 0x3e, + 0x03, 0x37, 0xa1, 0x07, 0x15, 0x18, 0x18, 0x0b, 0x0c, 0x1a, 0x18, 0x14, 0x08, 0x66, 0x07, 0x0d, + 0x09, 0x06, 0x02, 0x71, 0x06, 0x4c, 0x5a, 0x49, 0x05, 0x71, 0x03, 0x07, 0x08, 0x0b, 0x07, 0x02, + 0x6b, 0x15, 0x42, 0x4c, 0x4e, 0x21, 0x25, 0x4f, 0x49, 0x40, 0x15, 0x51, 0x9a, 0x97, 0x99, 0x50, + 0x01, 0xe1, 0xfe, 0xfa, 0x01, 0x06, 0xfe, 0x1f, 0x4c, 0xa4, 0xa2, 0x98, 0x41, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x53, 0x40, 0x09, + 0x0d, 0x40, 0x0b, 0x00, 0x4d, 0x20, 0x0d, 0x01, 0x04, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0c, 0x00, + 0x4d, 0x3f, 0x04, 0x01, 0x00, 0x2f, 0x0c, 0x3f, 0x0c, 0x02, 0x0c, 0x44, 0x0e, 0x11, 0x07, 0x03, + 0x44, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x10, 0x48, 0x06, 0x10, 0x03, 0x0c, 0x04, 0x0d, + 0x02, 0x07, 0x02, 0x04, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x01, + 0x10, 0xd6, 0x2b, 0xed, 0x32, 0x10, 0xde, 0xed, 0x5d, 0x32, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x5d, + 0x2b, 0x21, 0x26, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, 0x33, 0x11, 0x01, + 0x63, 0x2a, 0x63, 0x39, 0x6f, 0x63, 0x1c, 0x38, 0x35, 0x2d, 0x10, 0x6f, 0x67, 0xcd, 0x67, 0xfe, + 0x65, 0x02, 0x6b, 0x2c, 0x67, 0x66, 0x60, 0x24, 0x01, 0x7d, 0xfd, 0x95, 0x00, 0x02, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2c, 0x40, 0x19, 0xe7, 0x18, + 0x01, 0xd6, 0x16, 0x01, 0x0a, 0x46, 0x1f, 0x1a, 0x01, 0x1a, 0x21, 0x00, 0x46, 0x14, 0x20, 0x05, + 0x4a, 0x1d, 0x09, 0x0f, 0x4a, 0x17, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, + 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x5d, 0x5d, 0x13, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, + 0x20, 0x20, 0x26, 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0x01, 0x36, + 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, + 0xa0, 0xa3, 0xa3, 0xa0, 0xa0, 0xa3, 0xa3, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x72, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x3f, 0x40, 0x0b, 0x17, 0x46, 0x60, 0x03, 0x01, 0x03, + 0x1b, 0x07, 0x13, 0x44, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0a, 0x10, 0x48, 0x0a, 0x1a, 0x0a, + 0x02, 0x14, 0x48, 0x06, 0x13, 0x06, 0x13, 0x06, 0x00, 0x08, 0x08, 0x0f, 0x4a, 0x00, 0x03, 0x00, + 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xed, + 0x32, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, + 0x23, 0x11, 0x3e, 0x03, 0x17, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xe0, + 0x76, 0x82, 0x83, 0x78, 0x2c, 0x7b, 0x12, 0x2d, 0x2e, 0x2c, 0x1f, 0x0b, 0x27, 0x0b, 0x32, 0x3b, + 0x3c, 0x3b, 0x02, 0x72, 0x61, 0x6e, 0x6f, 0x63, 0xd1, 0x02, 0x63, 0x04, 0x06, 0x03, 0x02, 0x6b, + 0x01, 0x02, 0xc8, 0x2f, 0x39, 0x36, 0x2d, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd9, + 0x02, 0x76, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2f, 0x40, 0x18, 0x18, 0x00, 0x1d, 0x1d, 0x46, 0x0c, + 0x06, 0x28, 0x13, 0x46, 0x00, 0x27, 0x0c, 0x4a, 0x0d, 0x18, 0x4a, 0x09, 0x10, 0x09, 0x22, 0x4a, + 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x33, 0xed, 0xdd, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xda, + 0x32, 0xe9, 0x2f, 0x11, 0x39, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x26, 0x26, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x5a, + 0x55, 0x0b, 0x55, 0x4a, 0x1a, 0x75, 0x77, 0x0b, 0x51, 0x57, 0x7d, 0x07, 0x15, 0x26, 0x20, 0x1f, + 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x01, 0x33, 0xa0, 0xa3, 0xa3, + 0xa0, 0x8c, 0xa1, 0x11, 0x19, 0x21, 0x0d, 0x58, 0x10, 0x4b, 0x46, 0x14, 0x9f, 0x89, 0x2d, 0x4e, + 0x3b, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x72, 0x00, 0x19, 0x00, 0x24, 0x00, 0x59, + 0x40, 0x1d, 0x11, 0x0e, 0x44, 0x08, 0x60, 0x0d, 0x70, 0x0d, 0x80, 0x0d, 0x03, 0x0d, 0x26, 0x1a, + 0x46, 0x60, 0x05, 0x70, 0x05, 0x80, 0x05, 0x03, 0x05, 0x26, 0x21, 0x44, 0x12, 0x44, 0x15, 0xb8, + 0xff, 0xc0, 0x40, 0x17, 0x0a, 0x11, 0x48, 0x15, 0x25, 0x08, 0x12, 0x48, 0x21, 0x21, 0x0d, 0x15, + 0x02, 0x13, 0x08, 0x0e, 0x08, 0x0d, 0x08, 0x1d, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, + 0xed, 0x10, 0xde, 0x5d, 0x32, 0xed, 0x32, 0x31, 0x30, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x1e, 0x03, 0x17, 0x23, 0x26, 0x26, 0x27, 0x23, 0x15, 0x23, 0x11, 0x3e, 0x03, 0x17, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0xd6, 0x35, 0x56, 0x3e, 0x21, 0x2c, 0x33, + 0x11, 0x26, 0x24, 0x21, 0x0c, 0x81, 0x17, 0x3d, 0x23, 0x40, 0x7b, 0x12, 0x2b, 0x2c, 0x28, 0x7c, + 0x3c, 0x31, 0x07, 0x14, 0x0a, 0x1b, 0x3f, 0x38, 0x02, 0x72, 0x18, 0x32, 0x4d, 0x34, 0x36, 0x58, + 0x17, 0x1a, 0x3f, 0x45, 0x45, 0x1f, 0x3c, 0x6f, 0x39, 0xe4, 0x02, 0x62, 0x04, 0x07, 0x03, 0x02, + 0xca, 0x31, 0x2e, 0x01, 0x02, 0xba, 0x31, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, + 0x02, 0x79, 0x00, 0x2e, 0x00, 0x5a, 0xb9, 0x00, 0x2c, 0xff, 0xc0, 0x40, 0x15, 0x0d, 0x00, 0x4d, + 0x05, 0x46, 0x60, 0x25, 0x70, 0x25, 0x02, 0x25, 0x60, 0x15, 0x70, 0x15, 0x02, 0x15, 0x30, 0x1b, + 0x46, 0x0f, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x10, 0x48, 0x0f, 0x2b, 0xb8, 0xff, 0xc0, 0x40, 0x14, + 0x0d, 0x10, 0x48, 0x2b, 0x2f, 0x0a, 0x4a, 0x20, 0x20, 0x12, 0x2c, 0x00, 0x4a, 0x28, 0x09, 0x16, + 0x19, 0x4a, 0x12, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x12, 0x39, 0x10, 0xed, 0x01, + 0x10, 0xc6, 0x2b, 0xd6, 0x2b, 0xed, 0x10, 0xce, 0x5d, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, + 0x37, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0xe8, 0x1f, 0x29, 0x18, 0x09, 0x16, 0x22, 0x2a, + 0x15, 0x1c, 0x3c, 0x31, 0x20, 0x71, 0x63, 0x39, 0x55, 0x1d, 0x24, 0x19, 0x3d, 0x28, 0x62, 0x14, + 0x1f, 0x27, 0x13, 0x1d, 0x3f, 0x35, 0x22, 0x71, 0x73, 0x4d, 0x5c, 0x17, 0x24, 0x1b, 0x4b, 0x5a, + 0x0d, 0x17, 0x1d, 0x0f, 0x13, 0x1e, 0x17, 0x13, 0x08, 0x0a, 0x1a, 0x28, 0x3b, 0x2c, 0x57, 0x62, + 0x1a, 0x10, 0x5f, 0x0e, 0x14, 0x47, 0x12, 0x1b, 0x15, 0x10, 0x07, 0x0b, 0x1b, 0x2d, 0x43, 0x33, + 0x57, 0x5f, 0x21, 0x0e, 0x64, 0x10, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x00, 0x07, 0x00, 0x1f, 0x40, 0x0f, 0x01, 0x02, 0x44, 0x05, 0x07, 0x08, 0x02, 0x05, + 0x48, 0x07, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xdd, 0xfd, 0xcd, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0xdb, 0xa3, + 0x7c, 0xa3, 0x02, 0x6b, 0x66, 0xfd, 0xfb, 0x02, 0x05, 0x66, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xcd, 0x02, 0x6b, 0x00, 0x19, 0x00, 0x2f, 0x40, 0x0c, 0x12, 0x44, 0x60, 0x14, + 0x70, 0x14, 0x02, 0x14, 0x1b, 0x08, 0x44, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0d, 0x10, 0x48, + 0x06, 0x1a, 0x13, 0x07, 0x02, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x33, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0xf8, + 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, 0x7b, 0x14, 0x32, + 0x52, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x8b, 0xfe, 0x7d, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, + 0x35, 0x27, 0x01, 0x82, 0xfe, 0x75, 0x36, 0x58, 0x3e, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x16, 0x00, 0x83, 0x40, 0x0e, 0x13, 0x20, 0x10, 0x00, + 0x4d, 0x13, 0x10, 0x0f, 0x00, 0x4d, 0x48, 0x13, 0x01, 0x10, 0xb8, 0xff, 0xe0, 0x40, 0x0f, 0x0c, + 0x00, 0x4d, 0x24, 0x10, 0x01, 0x06, 0x20, 0x0c, 0x00, 0x4d, 0x2b, 0x06, 0x01, 0x03, 0xb8, 0xff, + 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xf8, 0x40, 0x30, 0x0e, 0x0f, 0x00, 0x4c, 0x47, + 0x03, 0x01, 0x0b, 0x40, 0x0c, 0x00, 0x4d, 0x06, 0x00, 0x0b, 0x16, 0x10, 0x05, 0x05, 0x0f, 0x11, + 0x1f, 0x11, 0x02, 0x11, 0x18, 0x05, 0x17, 0x0f, 0x0b, 0x1f, 0x0b, 0x2f, 0x0b, 0x03, 0x0b, 0x10, + 0x16, 0x08, 0x11, 0x02, 0x06, 0x10, 0x02, 0x05, 0x02, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x33, + 0x3f, 0x3f, 0x12, 0x39, 0x5d, 0x01, 0x10, 0xc6, 0x10, 0xce, 0x5d, 0x11, 0x17, 0x39, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x2b, 0x33, 0x2e, 0x03, + 0x27, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0xba, 0x18, 0x36, 0x30, + 0x26, 0x09, 0x82, 0x06, 0x18, 0x1d, 0x21, 0x10, 0x10, 0x20, 0x1c, 0x18, 0x08, 0x81, 0x0c, 0x23, + 0x2d, 0x36, 0x1d, 0x45, 0xae, 0xad, 0x9a, 0x31, 0x30, 0x7f, 0x87, 0x83, 0x34, 0x33, 0x83, 0x87, + 0x80, 0x30, 0x3c, 0x94, 0xa3, 0xa9, 0x4f, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, + 0x02, 0x6b, 0x00, 0x28, 0x01, 0x73, 0x40, 0x16, 0x25, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x23, 0x40, + 0x0e, 0x00, 0x4d, 0x23, 0x20, 0x0d, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x20, 0xb8, 0xff, + 0xe0, 0xb3, 0x0b, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x18, 0xb8, 0xff, + 0xe0, 0x40, 0x09, 0x0f, 0x00, 0x4d, 0x17, 0x40, 0x10, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xc0, 0xb3, + 0x0e, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xc8, 0x40, 0x09, 0x10, 0x00, 0x4d, 0x11, 0x40, 0x0e, 0x00, + 0x4d, 0x10, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xe0, 0x40, 0x13, 0x0b, + 0x00, 0x4d, 0x0a, 0x80, 0x0b, 0x00, 0x4d, 0x09, 0x80, 0x0b, 0x00, 0x4d, 0x08, 0x40, 0x0b, 0x00, + 0x4d, 0x05, 0xb8, 0xff, 0xe0, 0x40, 0x0a, 0x0d, 0x00, 0x4d, 0x03, 0x40, 0x11, 0x12, 0x00, 0x4c, + 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x01, 0x40, 0x0b, 0x00, 0x4d, 0x00, 0xb8, + 0xff, 0xe0, 0xb3, 0x0b, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x28, 0xb8, + 0xff, 0xc0, 0x40, 0x0a, 0x0d, 0x0e, 0x00, 0x4c, 0x23, 0x40, 0x0e, 0x00, 0x4d, 0x1e, 0xb8, 0xff, + 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x16, 0x40, 0x0f, 0x00, 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0xb3, + 0x0e, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x0f, 0x10, 0x00, 0x4c, 0x12, 0x40, 0x0f, + 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0x80, 0xb3, 0x0b, + 0x00, 0x4d, 0x09, 0xb8, 0xff, 0x80, 0xb3, 0x0b, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x09, + 0x0b, 0x00, 0x4d, 0x05, 0x40, 0x0e, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x36, 0x0d, 0x10, + 0x00, 0x4c, 0x00, 0x11, 0x05, 0x10, 0x04, 0x0b, 0x18, 0x23, 0x17, 0x28, 0x04, 0x1d, 0x14, 0x14, + 0x0b, 0x1d, 0x3f, 0x0a, 0x01, 0x0a, 0x0a, 0x44, 0x0f, 0x0b, 0x1f, 0x0b, 0x02, 0x0b, 0x2a, 0x30, + 0x1e, 0x01, 0x1e, 0x44, 0x1d, 0x29, 0x23, 0x05, 0x14, 0x28, 0x04, 0x10, 0x1d, 0x02, 0x18, 0x08, + 0x10, 0x08, 0x0b, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xed, + 0x5d, 0x10, 0xda, 0x5d, 0xe9, 0x2f, 0x5d, 0x11, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x17, 0x39, 0x12, + 0x17, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x1e, 0x03, 0x17, 0x34, 0x2e, 0x02, + 0x35, 0x33, 0x0e, 0x03, 0x07, 0x23, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, 0x2e, 0x03, 0x27, + 0x33, 0x0e, 0x03, 0x15, 0x3e, 0x03, 0x37, 0x01, 0x28, 0x04, 0x10, 0x13, 0x17, 0x0b, 0x02, 0x02, + 0x02, 0x72, 0x03, 0x06, 0x08, 0x0b, 0x07, 0x66, 0x16, 0x2c, 0x16, 0x16, 0x30, 0x14, 0x66, 0x08, + 0x0c, 0x09, 0x06, 0x02, 0x72, 0x01, 0x02, 0x02, 0x02, 0x09, 0x17, 0x15, 0x12, 0x05, 0x01, 0x90, + 0x13, 0x38, 0x44, 0x4e, 0x29, 0x34, 0x77, 0x7c, 0x7f, 0x3b, 0x4c, 0xa1, 0x9f, 0x9a, 0x45, 0x3f, + 0x91, 0x42, 0x3f, 0x94, 0x3f, 0x45, 0x9b, 0x9f, 0xa1, 0x4b, 0x3b, 0x7e, 0x7d, 0x77, 0x34, 0x20, + 0x4c, 0x4a, 0x3e, 0x12, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x00, 0x17, + 0x00, 0x66, 0xb5, 0x12, 0x20, 0x0f, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, + 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0x40, 0x27, 0x0f, 0x00, + 0x4d, 0x0d, 0x18, 0x0c, 0x0e, 0x06, 0x03, 0x07, 0x03, 0x00, 0x10, 0x12, 0x03, 0x0f, 0x17, 0x03, + 0x0f, 0x03, 0x0f, 0x07, 0x11, 0x17, 0x07, 0x17, 0x08, 0x11, 0x02, 0x03, 0x0c, 0x12, 0x0f, 0x04, + 0x06, 0x0d, 0x02, 0x06, 0x08, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x2f, 0x2f, + 0xc6, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x18, + 0x10, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x1e, 0x03, 0x17, 0x01, 0x64, 0x13, 0x37, + 0x1e, 0x1d, 0x3a, 0x15, 0x85, 0x0a, 0x27, 0x2f, 0x34, 0x18, 0xa2, 0x85, 0x62, 0x67, 0x7c, 0x9e, + 0x1b, 0x34, 0x2d, 0x22, 0x0a, 0x33, 0x7c, 0x3e, 0x3b, 0x7f, 0x33, 0x1b, 0x4c, 0x58, 0x5d, 0x2b, + 0x01, 0x24, 0xc6, 0xc6, 0xfe, 0xdf, 0x2b, 0x5e, 0x59, 0x4d, 0x1b, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x14, 0x00, 0x3e, 0x40, 0x21, 0x12, 0x11, 0x0e, 0x00, + 0x00, 0x0e, 0x44, 0x05, 0x06, 0x80, 0x0c, 0x90, 0x0c, 0x02, 0x0c, 0x0c, 0x15, 0x16, 0x11, 0x02, + 0x0d, 0x08, 0x0e, 0x0b, 0x00, 0x03, 0x05, 0x0c, 0x08, 0x06, 0x02, 0x05, 0x02, 0x00, 0x3f, 0x3f, + 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xce, 0x32, 0xed, 0x39, + 0x3d, 0x2f, 0x18, 0x10, 0xcd, 0x32, 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, + 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x33, 0x16, 0x16, 0xfe, 0x0b, 0x1d, 0x1d, 0x1b, 0x0b, 0x7f, + 0x13, 0x26, 0x2a, 0x30, 0x1c, 0x7c, 0x37, 0x53, 0x26, 0x84, 0x17, 0x38, 0x01, 0x50, 0x17, 0x46, + 0x4e, 0x50, 0x20, 0x33, 0x60, 0x5e, 0x5d, 0x31, 0xec, 0xeb, 0x61, 0xb9, 0x66, 0x48, 0x95, 0x00, + 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x11, 0x00, 0x66, 0xb5, 0x0e, + 0x40, 0x0a, 0x00, 0x4d, 0x04, 0xb8, 0xff, 0xe0, 0xb6, 0x0a, 0x00, 0x4d, 0x00, 0x07, 0x01, 0x07, + 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0d, 0x10, 0x48, 0x07, 0x13, 0x05, 0x0e, 0x11, 0x10, 0xb8, 0xff, + 0xc0, 0xb4, 0x09, 0x10, 0x48, 0x10, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x10, 0x48, 0x09, + 0x12, 0x00, 0x11, 0x01, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0d, 0x10, 0x48, 0x11, 0x00, 0x11, + 0x02, 0x0f, 0x48, 0x10, 0x02, 0x06, 0x48, 0x07, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xcd, + 0x01, 0x2f, 0x2b, 0x5d, 0x10, 0xc6, 0x2b, 0xc6, 0x2b, 0x11, 0x39, 0x39, 0x10, 0xce, 0x2b, 0x5d, + 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, + 0x35, 0x21, 0x01, 0xbd, 0x2b, 0x48, 0x3e, 0x37, 0x19, 0x01, 0x0a, 0xfe, 0x68, 0x16, 0x32, 0x3e, + 0x49, 0x2c, 0xee, 0x01, 0x82, 0x02, 0x15, 0x42, 0x74, 0x69, 0x61, 0x2f, 0x66, 0x47, 0x2b, 0x5f, + 0x6c, 0x7e, 0x4a, 0x66, 0x00, 0x01, 0x00, 0x71, 0xff, 0x5b, 0x01, 0x86, 0x02, 0xbb, 0x00, 0x07, + 0x00, 0x2f, 0x40, 0x1b, 0x5f, 0x06, 0x01, 0x40, 0x06, 0x01, 0x06, 0x5f, 0x01, 0x01, 0x40, 0x01, + 0x01, 0x01, 0x09, 0x03, 0x6e, 0x00, 0x08, 0x05, 0x72, 0x06, 0x12, 0x02, 0x72, 0x00, 0x10, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xce, 0x5d, 0x5d, 0xce, 0x5d, 0x5d, 0x31, + 0x30, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x71, 0x01, 0x15, 0xa0, 0xa0, 0xfe, 0xeb, + 0x02, 0xbb, 0x60, 0xfd, 0x60, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xff, 0x5b, 0x01, 0xc7, + 0x02, 0xbb, 0x00, 0x03, 0x00, 0x2a, 0x40, 0x15, 0x01, 0x03, 0x00, 0x03, 0x76, 0x02, 0x01, 0x14, + 0x02, 0x01, 0x03, 0x02, 0x00, 0x04, 0x02, 0x02, 0x12, 0x01, 0x10, 0x00, 0x10, 0x00, 0x3f, 0x3f, + 0x3f, 0x01, 0x2f, 0x10, 0xc6, 0x10, 0x00, 0xc1, 0x87, 0x05, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, + 0x13, 0x33, 0x01, 0x23, 0x31, 0x7e, 0x01, 0x18, 0x7f, 0x02, 0xbb, 0xfc, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x6d, 0xff, 0x5b, 0x01, 0x83, 0x02, 0xbb, 0x00, 0x07, 0x00, 0x2f, 0x40, 0x1a, + 0x04, 0x03, 0x6e, 0x40, 0x00, 0x01, 0x00, 0x40, 0x07, 0x01, 0x07, 0x09, 0x01, 0x50, 0x06, 0x01, + 0x06, 0x08, 0x05, 0x72, 0x07, 0x10, 0x02, 0x72, 0x00, 0x12, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0x5d, 0xc0, 0x10, 0xce, 0x5d, 0xde, 0x5d, 0xed, 0x32, 0x31, 0x30, 0x05, 0x21, 0x35, + 0x33, 0x11, 0x23, 0x35, 0x21, 0x01, 0x83, 0xfe, 0xea, 0xa0, 0xa0, 0x01, 0x16, 0xa5, 0x60, 0x02, + 0xa0, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xff, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x06, + 0x00, 0x29, 0x40, 0x14, 0x05, 0x03, 0x04, 0x03, 0x07, 0x00, 0x01, 0x06, 0x03, 0x08, 0x02, 0x02, + 0x07, 0x08, 0x01, 0x03, 0x02, 0x72, 0x06, 0x02, 0x00, 0x3f, 0xfd, 0xcd, 0x32, 0x01, 0x11, 0x12, + 0x39, 0x3d, 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x07, 0x27, 0x07, 0x27, + 0x13, 0x33, 0x01, 0xeb, 0x6f, 0x7e, 0x7e, 0x70, 0xb9, 0x69, 0x01, 0x35, 0x36, 0xda, 0xda, 0x36, + 0x01, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xff, 0x5b, 0x01, 0xec, 0xff, 0xc6, 0x00, 0x03, + 0x00, 0x17, 0x40, 0x0a, 0x02, 0x05, 0x03, 0x04, 0x00, 0x55, 0x03, 0x12, 0x02, 0x12, 0x00, 0x3f, + 0x3f, 0xed, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x31, 0x30, 0x17, 0x21, 0x15, 0x21, 0x08, 0x01, 0xe4, + 0xfe, 0x1c, 0x3a, 0x6b, 0x00, 0x01, 0x00, 0x98, 0x02, 0x01, 0x01, 0x73, 0x02, 0xb3, 0x00, 0x03, + 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x02, 0x00, 0x7d, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, + 0x31, 0x30, 0x13, 0x17, 0x07, 0x27, 0xd5, 0x9e, 0x2d, 0xae, 0x02, 0xb3, 0x6f, 0x43, 0x54, 0x00, + 0x00, 0x02, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x01, 0xe2, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x53, + 0x40, 0x0d, 0x04, 0x1f, 0x01, 0x24, 0x51, 0x04, 0x53, 0x14, 0x30, 0x2c, 0x0c, 0x53, 0x1d, 0xb8, + 0xff, 0xc0, 0x40, 0x24, 0x0c, 0x10, 0x48, 0x1d, 0x2f, 0x5f, 0x07, 0x6f, 0x07, 0x02, 0x07, 0x57, + 0x50, 0x22, 0x60, 0x22, 0x02, 0x22, 0x22, 0x0f, 0x40, 0x00, 0x01, 0x00, 0x57, 0x18, 0x07, 0x28, + 0x40, 0x0d, 0x00, 0x4d, 0x28, 0x57, 0x0f, 0x0b, 0x00, 0x3f, 0xed, 0x2b, 0x3f, 0xed, 0x5d, 0x11, + 0x39, 0x2f, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0xc4, 0x10, 0xde, 0xed, 0xed, 0x31, + 0x30, 0x00, 0x5d, 0x37, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x16, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0xfb, 0x14, + 0x26, 0x0e, 0x0c, 0x22, 0x0e, 0x13, 0x24, 0x1b, 0x10, 0x30, 0x1b, 0x3a, 0x4d, 0x2e, 0x14, 0x1b, + 0x6a, 0x42, 0x2d, 0x49, 0x34, 0x1c, 0x20, 0x36, 0x46, 0x26, 0x30, 0x25, 0x2c, 0x36, 0x23, 0x41, + 0x14, 0x11, 0x17, 0x54, 0x58, 0x01, 0x02, 0x6c, 0x02, 0x03, 0x05, 0x0c, 0x16, 0x12, 0x20, 0x1b, + 0x01, 0x8a, 0x1b, 0x31, 0x47, 0x2c, 0xfe, 0xe8, 0x06, 0x10, 0x10, 0x25, 0x3b, 0x2b, 0x29, 0x38, + 0x22, 0x0f, 0x08, 0x0f, 0x23, 0x2f, 0x0a, 0x07, 0x63, 0x08, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x3e, + 0xff, 0xf5, 0x01, 0xd6, 0x02, 0xb6, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x5b, 0x40, 0x10, 0x0a, 0x40, + 0x0c, 0x00, 0x4d, 0x09, 0x40, 0x0c, 0x00, 0x4d, 0x08, 0x40, 0x0c, 0x00, 0x4d, 0x03, 0xb8, 0xff, + 0xc0, 0x40, 0x11, 0x0c, 0x00, 0x4d, 0x00, 0x53, 0x60, 0x0d, 0x70, 0x0d, 0x02, 0x0d, 0x21, 0x18, + 0x51, 0x07, 0x51, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x10, 0x48, 0x16, 0x20, 0x06, 0x55, + 0x18, 0x03, 0x57, 0x1b, 0x0b, 0x17, 0x01, 0x16, 0x00, 0x07, 0x57, 0x12, 0x07, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0xed, 0xd5, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x37, 0x15, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x01, 0x59, 0x2b, 0x2c, 0x14, 0x27, 0x0e, 0x0e, 0x1f, 0x0b, 0x30, + 0x38, 0x7d, 0x1e, 0x3a, 0x54, 0x36, 0x30, 0x64, 0x22, 0x7b, 0x1a, 0x30, 0x18, 0x2e, 0x46, 0x2f, + 0x18, 0xee, 0x42, 0x46, 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x4b, 0x38, 0x5b, 0x40, 0x23, 0x0e, + 0x0b, 0x02, 0x93, 0x15, 0xeb, 0x0c, 0x09, 0x23, 0x41, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xd2, 0x01, 0xe2, 0x00, 0x1f, 0x00, 0x35, 0x40, 0x10, 0x30, 0x11, 0x01, 0x08, + 0x40, 0x18, 0x60, 0x18, 0x70, 0x18, 0x03, 0x18, 0x21, 0x11, 0x53, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x0d, 0x0c, 0x10, 0x48, 0x00, 0x20, 0x14, 0x57, 0x1b, 0x07, 0x0c, 0x57, 0x05, 0x0b, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xc6, 0x31, 0x30, 0x5d, 0x37, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x2c, 0x20, 0x42, 0x65, + 0x46, 0x2a, 0x44, 0x23, 0x1b, 0x14, 0x31, 0x26, 0x2c, 0x3b, 0x24, 0x10, 0x49, 0x58, 0x1d, 0x3f, + 0x1a, 0x12, 0x1a, 0x4a, 0x32, 0x48, 0x67, 0x42, 0x1f, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x0c, 0x0e, + 0x63, 0x07, 0x0b, 0x15, 0x25, 0x34, 0x1e, 0x41, 0x4a, 0x08, 0x09, 0x65, 0x0a, 0x0d, 0x26, 0x42, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, 0xff, 0xf5, 0x01, 0xae, 0x02, 0xb6, 0x00, 0x0c, + 0x00, 0x1b, 0x00, 0x60, 0x40, 0x13, 0x40, 0x1b, 0x01, 0xc4, 0x1b, 0x01, 0x40, 0x1a, 0x01, 0xc0, + 0x1a, 0x01, 0x40, 0x19, 0x01, 0xc0, 0x19, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, + 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x0c, 0x00, 0x4d, 0x03, 0x40, 0x0c, 0x00, 0x4d, 0x06, 0x19, + 0x51, 0x1b, 0x1d, 0x00, 0x53, 0x13, 0x1c, 0x1b, 0x01, 0x1a, 0x00, 0x07, 0x55, 0x19, 0x0a, 0x57, + 0x16, 0x0b, 0x03, 0x57, 0x10, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0xd5, 0xed, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0xed, 0x10, 0xde, 0xed, 0x32, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x5d, 0x71, + 0x5d, 0x71, 0x5d, 0x71, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x01, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x37, + 0x99, 0x2f, 0x34, 0x0f, 0x1a, 0x0e, 0x0e, 0x24, 0x14, 0x2c, 0x28, 0x01, 0x15, 0x22, 0x62, 0x2f, + 0x6e, 0x71, 0x5f, 0x5d, 0x19, 0x30, 0x12, 0x7b, 0xee, 0x3f, 0x50, 0x02, 0x02, 0x01, 0x00, 0x08, + 0x0b, 0x46, 0xfe, 0xde, 0x0b, 0x0e, 0x82, 0x71, 0x73, 0x85, 0x0b, 0x0a, 0xd6, 0x15, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x5c, + 0xb9, 0x00, 0x12, 0xff, 0xc0, 0x40, 0x37, 0x19, 0x1a, 0x00, 0x4c, 0x1b, 0x53, 0x13, 0x1f, 0x0b, + 0x3f, 0x0b, 0x02, 0x0b, 0x27, 0x25, 0x0c, 0x53, 0x70, 0x00, 0x01, 0x00, 0x26, 0x0c, 0x40, 0x0f, + 0x00, 0x4d, 0x4f, 0x0c, 0x5f, 0x0c, 0x02, 0x0c, 0x55, 0x0f, 0x1b, 0x01, 0x1b, 0x1b, 0x05, 0x12, + 0x40, 0x0f, 0x01, 0x0f, 0x57, 0x16, 0x07, 0x30, 0x20, 0x01, 0x20, 0x57, 0x05, 0x0b, 0x00, 0x3f, + 0xed, 0x5d, 0x3f, 0xfd, 0x5d, 0xc6, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd6, + 0x5d, 0xed, 0x32, 0x10, 0xde, 0x5d, 0xc6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x37, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x1f, 0x26, + 0x3e, 0x50, 0x2a, 0x68, 0x6c, 0x01, 0x01, 0xfe, 0xcf, 0x4c, 0x3c, 0x25, 0x43, 0x17, 0x11, 0x20, + 0x48, 0x2d, 0x3c, 0x5f, 0x43, 0x24, 0x01, 0x3b, 0x0a, 0x16, 0x22, 0x19, 0x18, 0x23, 0x17, 0x0d, + 0x02, 0xe7, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, 0x76, 0x0c, 0x1a, 0x08, 0x2e, 0x35, 0x10, 0x08, 0x69, + 0x0b, 0x0f, 0x1f, 0x3d, 0x5a, 0x6d, 0x13, 0x23, 0x1c, 0x11, 0x10, 0x1c, 0x24, 0x13, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0xec, 0x02, 0xb5, 0x00, 0x1b, 0x00, 0x56, 0xb9, 0x00, + 0x03, 0xff, 0xc0, 0xb6, 0x0d, 0x00, 0x4d, 0x50, 0x03, 0x01, 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x29, + 0x0d, 0x00, 0x4d, 0x50, 0x02, 0x01, 0x19, 0x00, 0x0d, 0x01, 0x0d, 0x1d, 0x1a, 0x17, 0x51, 0x01, + 0x04, 0x60, 0x03, 0x70, 0x03, 0x02, 0x4f, 0x03, 0x01, 0x03, 0x1c, 0x1b, 0x06, 0x19, 0x55, 0x18, + 0x0a, 0x11, 0x57, 0x0a, 0x01, 0x02, 0x55, 0x03, 0x0a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0xdd, 0x32, 0xed, 0x32, 0x10, 0xc6, 0x5d, 0xce, 0x31, 0x30, + 0x5d, 0x2b, 0x5d, 0x2b, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x8b, 0x67, + 0x67, 0x21, 0x38, 0x48, 0x26, 0x27, 0x52, 0x21, 0x15, 0x17, 0x45, 0x1f, 0x11, 0x1f, 0x17, 0x0e, + 0xc1, 0xc1, 0x01, 0x70, 0x66, 0x1b, 0x39, 0x4b, 0x2d, 0x13, 0x0e, 0x10, 0x64, 0x08, 0x11, 0x06, + 0x14, 0x25, 0x1e, 0x19, 0x66, 0xfe, 0x90, 0x00, 0x00, 0x02, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, + 0x01, 0xe0, 0x00, 0x0b, 0x00, 0x27, 0x00, 0x47, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0x40, 0x27, 0x11, + 0x12, 0x00, 0x4c, 0x1c, 0x51, 0x06, 0x51, 0x60, 0x0c, 0x01, 0x0c, 0x29, 0x00, 0x53, 0x60, 0x22, + 0x70, 0x22, 0x02, 0x22, 0x28, 0x03, 0x57, 0x1f, 0x1f, 0x0f, 0x0a, 0x57, 0x25, 0x0b, 0x13, 0x40, + 0x16, 0x01, 0x16, 0x57, 0x0f, 0x0f, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x12, 0x39, 0x2f, + 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x37, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x01, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x9e, 0x2a, 0x2d, 0x14, 0x23, 0x0e, 0x0e, 0x16, 0x0c, 0x6c, + 0x01, 0x18, 0x6f, 0x7b, 0x2c, 0x51, 0x25, 0x17, 0x1d, 0x40, 0x30, 0x20, 0x2a, 0x18, 0x0a, 0x1a, + 0x2b, 0x19, 0x5c, 0x5f, 0x80, 0x6e, 0x4d, 0x5a, 0xfa, 0x3a, 0x3d, 0x0a, 0x08, 0xe2, 0x03, 0x02, + 0xfe, 0xbd, 0x73, 0x6e, 0x12, 0x0c, 0x68, 0x0b, 0x13, 0x0f, 0x1a, 0x23, 0x14, 0x13, 0x0a, 0x0a, + 0x74, 0x67, 0x74, 0x72, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, + 0x02, 0xb6, 0x00, 0x15, 0x00, 0x42, 0x40, 0x11, 0x0e, 0x51, 0x40, 0x0b, 0x60, 0x0b, 0x70, 0x0b, + 0x03, 0x0b, 0x17, 0x14, 0x51, 0x00, 0x03, 0x51, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x09, 0x10, + 0x48, 0x01, 0x16, 0x15, 0x06, 0x0d, 0x06, 0x11, 0x57, 0x06, 0x0b, 0x02, 0x01, 0x01, 0x00, 0x00, + 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x7d, 0x2f, 0x18, 0xd6, 0x2b, 0xed, + 0xd0, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x33, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x3f, 0x7b, 0x0f, + 0x2a, 0x10, 0x34, 0x46, 0x2a, 0x12, 0x7b, 0x1e, 0x2a, 0x11, 0x21, 0x0a, 0x02, 0xa1, 0x15, 0xe4, + 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0x00, + 0x00, 0x02, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xac, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x4c, + 0xb9, 0x00, 0x06, 0xff, 0xf8, 0x40, 0x2e, 0x09, 0x00, 0x4d, 0x17, 0x15, 0x51, 0x70, 0x18, 0x01, + 0x3f, 0x18, 0x01, 0x00, 0x18, 0x01, 0x18, 0x21, 0x10, 0x21, 0x20, 0x21, 0x60, 0x21, 0x03, 0x00, + 0x54, 0x20, 0x06, 0x60, 0x06, 0x70, 0x06, 0x03, 0x06, 0x1f, 0x1c, 0x57, 0x0f, 0x07, 0x15, 0x55, + 0x18, 0x03, 0x58, 0x09, 0x00, 0x00, 0x3f, 0xfd, 0xde, 0xed, 0x3f, 0xfd, 0xc6, 0x01, 0x2f, 0x5d, + 0xed, 0x5d, 0x10, 0xdc, 0x5d, 0x5d, 0x5d, 0xfd, 0xcd, 0x31, 0x30, 0x2b, 0x01, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x35, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x1c, 0x2e, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0xb7, 0x26, 0x43, 0x1c, 0x30, 0x41, 0x27, 0x10, 0x82, 0xfd, 0x1f, + 0x24, 0x11, 0x30, 0x1e, 0x02, 0x5d, 0x24, 0x2a, 0x2a, 0x24, 0x25, 0x2a, 0x2a, 0xfd, 0x92, 0x12, + 0x0d, 0x1c, 0x35, 0x4c, 0x31, 0xad, 0x66, 0xfe, 0xdd, 0x2a, 0x29, 0x09, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x31, 0xff, 0x56, 0x01, 0x90, 0x02, 0xac, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x4d, + 0x40, 0x0f, 0x08, 0x18, 0x0c, 0x00, 0x4d, 0x12, 0x10, 0x0f, 0x51, 0x00, 0x00, 0x20, 0x00, 0x02, + 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x21, 0x0d, 0x10, 0x48, 0x00, 0x21, 0x14, 0x54, 0x00, 0x1a, 0x10, + 0x1a, 0x20, 0x1a, 0x40, 0x1a, 0x50, 0x1a, 0x70, 0x1a, 0x06, 0x1a, 0x10, 0x55, 0x13, 0x17, 0x58, + 0x1d, 0x00, 0x09, 0x0c, 0x57, 0x05, 0x0f, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xde, 0xed, 0x01, + 0x2f, 0x5d, 0xed, 0x10, 0xde, 0x2b, 0x5d, 0xfd, 0xd0, 0xcd, 0x31, 0x30, 0x2b, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x21, + 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x90, 0x1c, 0x31, + 0x43, 0x27, 0x30, 0x52, 0x26, 0x26, 0x19, 0x47, 0x1d, 0x1f, 0x22, 0xbe, 0x01, 0x39, 0x0f, 0x2e, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x18, 0x13, 0x68, 0x0e, + 0x19, 0x25, 0x32, 0x01, 0x57, 0x66, 0x87, 0x24, 0x2a, 0x2a, 0x24, 0x25, 0x2a, 0x2a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, 0x02, 0xb6, 0x00, 0x1a, 0x00, 0x51, 0x40, 0x16, + 0x05, 0x00, 0x06, 0x10, 0x06, 0x20, 0x06, 0x40, 0x06, 0x60, 0x06, 0x05, 0x06, 0x1c, 0x30, 0x1c, + 0x01, 0x16, 0x0b, 0x00, 0x51, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x1b, 0x09, 0x10, 0x48, 0x19, 0x1b, + 0x11, 0x10, 0x10, 0x30, 0x10, 0x70, 0x10, 0x03, 0x10, 0x1a, 0x01, 0x19, 0x00, 0x00, 0x0b, 0x16, + 0x03, 0x05, 0x17, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x2f, + 0x5d, 0x33, 0x10, 0xd6, 0x2b, 0xed, 0x32, 0x32, 0x5d, 0x10, 0xc6, 0x5d, 0x32, 0x31, 0x30, 0x13, + 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, + 0x11, 0x37, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, + 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x7c, 0x01, 0x1c, 0x15, 0x2f, 0x32, + 0x2f, 0x15, 0x17, 0x36, 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, + 0x12, 0xde, 0x02, 0xa1, 0x15, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xb0, 0x00, 0x13, 0x00, 0x36, 0x40, 0x21, 0x60, 0x00, 0x70, 0x00, 0x02, 0x3f, 0x00, 0x01, + 0x00, 0x15, 0x0d, 0x51, 0x09, 0x50, 0x0a, 0x60, 0x0a, 0x70, 0x0a, 0x03, 0x0a, 0x14, 0x0c, 0x00, + 0x0a, 0x55, 0x0b, 0x00, 0x13, 0x10, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, + 0x01, 0x10, 0xd6, 0x5d, 0xd5, 0xed, 0x10, 0xce, 0x5d, 0x5d, 0x31, 0x30, 0x25, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd3, + 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x82, 0xfd, 0x26, 0x1d, 0x25, 0x32, 0x08, 0x14, 0x02, + 0x0a, 0x0b, 0x08, 0x65, 0x61, 0x01, 0x8f, 0x66, 0xfe, 0x02, 0x30, 0x22, 0x14, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x01, 0xd7, 0x01, 0xdb, 0x00, 0x27, 0x00, 0x84, 0x40, 0x5e, + 0x2b, 0x1c, 0x01, 0x7f, 0x13, 0x01, 0x02, 0x15, 0x40, 0x15, 0x00, 0x4d, 0x15, 0x40, 0x0f, 0x00, + 0x4d, 0x2f, 0x15, 0x3f, 0x15, 0x5f, 0x15, 0x7f, 0x15, 0x9f, 0x15, 0xdf, 0x15, 0xef, 0x15, 0xff, + 0x15, 0x08, 0x15, 0x52, 0x14, 0x14, 0x1f, 0x07, 0x40, 0x16, 0x00, 0x4d, 0x2f, 0x07, 0x3f, 0x07, + 0x4f, 0x07, 0xcf, 0x07, 0x04, 0x07, 0x52, 0x0f, 0x05, 0x1f, 0x05, 0x5f, 0x05, 0x03, 0x05, 0x29, + 0x20, 0x1d, 0x30, 0x1d, 0x40, 0x1d, 0x03, 0x1d, 0x52, 0x80, 0x1f, 0x01, 0x1f, 0x28, 0x19, 0x57, + 0x22, 0x0b, 0x14, 0x14, 0x00, 0x1d, 0x06, 0x06, 0x06, 0x25, 0x0d, 0x57, 0x00, 0x0b, 0x00, 0x3f, + 0xed, 0x33, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x10, + 0xde, 0x5d, 0xed, 0x5d, 0x2b, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x2b, 0x2b, 0x31, 0x30, 0x00, 0x5f, + 0x5d, 0x5d, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, + 0x07, 0x16, 0x16, 0x15, 0x15, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, + 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x01, 0x57, 0x27, 0x32, 0x1d, 0x0a, 0x64, 0x07, + 0x0b, 0x0f, 0x08, 0x09, 0x14, 0x08, 0x03, 0x04, 0x64, 0x13, 0x15, 0x06, 0x11, 0x08, 0x64, 0x27, + 0x4c, 0x1d, 0x1a, 0x29, 0x0f, 0x11, 0x2e, 0x01, 0xdb, 0x18, 0x30, 0x49, 0x31, 0xfe, 0xe7, 0x01, + 0x1f, 0x1c, 0x22, 0x12, 0x06, 0x03, 0x04, 0x13, 0x2e, 0x1c, 0x5e, 0x6c, 0x30, 0x26, 0x02, 0x02, + 0xfe, 0x8f, 0x01, 0xc4, 0x0b, 0x0c, 0x0d, 0x0f, 0x0b, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb9, 0x01, 0xe0, 0x00, 0x13, 0x00, 0x2d, 0xb6, 0x0b, 0x51, 0x08, 0x15, 0x12, + 0x51, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x09, 0x10, 0x48, 0x00, 0x14, 0x13, 0x06, 0x0a, 0x06, + 0x30, 0x0e, 0x01, 0x0e, 0x57, 0x03, 0x0b, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xed, 0x10, 0xde, 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, + 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x3f, 0x21, 0x61, 0x39, 0x38, 0x4a, + 0x2b, 0x12, 0x7b, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, 0x01, 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, + 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x02, 0x02, 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1d, + 0xff, 0xf3, 0x01, 0xd8, 0x01, 0xe2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x26, 0x40, 0x15, 0x1a, 0x53, + 0x00, 0x40, 0x0c, 0x00, 0x4d, 0x00, 0x21, 0x14, 0x53, 0x0a, 0x20, 0x1d, 0x57, 0x0f, 0x0b, 0x17, + 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xde, 0x2b, 0xed, + 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xd8, + 0x20, 0x3a, 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, 0x31, 0x51, 0x3b, 0x20, + 0xfe, 0xc2, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x32, 0x30, 0x31, 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, + 0x42, 0x5b, 0x38, 0x37, 0x5b, 0x41, 0x23, 0x23, 0x41, 0x5b, 0x38, 0x3f, 0x4e, 0x4e, 0x3f, 0x3f, + 0x4d, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x00, 0x0c, + 0x00, 0x1c, 0x00, 0x36, 0x40, 0x0e, 0x00, 0x53, 0x60, 0x0d, 0x70, 0x0d, 0x02, 0x0d, 0x1e, 0x14, + 0x51, 0x07, 0x51, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x10, 0x48, 0x17, 0x1d, 0x03, 0x57, + 0x1a, 0x0b, 0x16, 0x0e, 0x0a, 0x57, 0x12, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x15, 0x23, + 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x01, 0x58, 0x32, 0x33, 0x0e, 0x20, 0x0b, 0x0c, 0x28, 0x14, + 0x2c, 0x2a, 0x7d, 0x18, 0x2e, 0x46, 0x2e, 0x2f, 0x32, 0x7b, 0x22, 0x63, 0x30, 0x6d, 0x74, 0xe7, + 0x3f, 0x51, 0x03, 0x01, 0xfe, 0xfe, 0x08, 0x0a, 0x47, 0x45, 0x36, 0x5b, 0x41, 0x24, 0x17, 0xb1, + 0x02, 0x6c, 0x0b, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x5b, 0x01, 0xb6, + 0x01, 0xe0, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x35, 0x40, 0x1f, 0x19, 0x51, 0x07, 0x51, 0x60, 0x17, + 0x70, 0x17, 0x02, 0x17, 0x23, 0x00, 0x53, 0x70, 0x0d, 0x01, 0x0d, 0x22, 0x1a, 0x55, 0x06, 0x03, + 0x57, 0x1d, 0x07, 0x18, 0x0e, 0x0a, 0x57, 0x12, 0x0b, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xfd, 0xd6, + 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xde, 0x5d, 0xed, 0xed, 0x31, 0x30, 0x37, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x11, 0x23, 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x9c, 0x2b, 0x2c, 0x15, + 0x25, 0x0e, 0x09, 0x1f, 0x11, 0x33, 0x33, 0x7d, 0x1e, 0x39, 0x55, 0x36, 0x17, 0x33, 0x30, 0x2b, + 0x10, 0x7b, 0x17, 0x33, 0x17, 0x2e, 0x46, 0x2f, 0x18, 0xe7, 0x41, 0x47, 0x0a, 0x08, 0x01, 0x02, + 0x01, 0x03, 0x51, 0x3b, 0x36, 0x5b, 0x40, 0x24, 0x04, 0x07, 0x09, 0x05, 0xfd, 0x94, 0xb2, 0x0b, + 0x0d, 0x23, 0x40, 0x5b, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x01, 0xcb, 0x01, 0xdf, 0x00, 0x13, + 0x00, 0x21, 0xb3, 0x13, 0x08, 0x51, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x0b, 0x09, 0x10, 0x48, 0x0b, + 0x14, 0x05, 0x57, 0x0e, 0x0b, 0x09, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, + 0xcd, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x17, 0x01, 0xb5, 0x0c, 0x21, 0x22, 0x20, 0x0b, 0x1a, 0x32, 0x1a, 0x7c, 0x31, + 0x67, 0x45, 0x0a, 0x25, 0x2a, 0x2b, 0x11, 0x01, 0x59, 0x03, 0x06, 0x05, 0x02, 0x05, 0x07, 0xfe, + 0xa3, 0x01, 0xb7, 0x12, 0x16, 0x02, 0x05, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, + 0xff, 0xf5, 0x01, 0xba, 0x01, 0xe2, 0x00, 0x31, 0x00, 0x4c, 0xb9, 0x00, 0x2f, 0xff, 0xc0, 0x40, + 0x0a, 0x0d, 0x00, 0x4d, 0x15, 0x03, 0x53, 0x20, 0x26, 0x01, 0x26, 0xb8, 0xff, 0xc0, 0x40, 0x09, + 0x0d, 0x10, 0x48, 0x26, 0x33, 0x1c, 0x53, 0x0d, 0x2e, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, 0x10, + 0x48, 0x2e, 0x32, 0x21, 0x08, 0x19, 0x00, 0x57, 0x2b, 0x07, 0x19, 0x57, 0x12, 0x0b, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x2b, 0xd6, 0xed, 0x10, 0xde, 0x2b, 0x5d, + 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x37, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, + 0xe4, 0x2d, 0x30, 0x0f, 0x1b, 0x23, 0x13, 0x1b, 0x38, 0x2e, 0x1e, 0x17, 0x31, 0x4c, 0x35, 0x2e, + 0x4f, 0x1d, 0x13, 0x11, 0x48, 0x2d, 0x2f, 0x21, 0x0f, 0x19, 0x21, 0x13, 0x1b, 0x3a, 0x2f, 0x1e, + 0x16, 0x33, 0x52, 0x3c, 0x3d, 0x56, 0x1a, 0x13, 0x23, 0x4f, 0x5d, 0x0d, 0x14, 0x0d, 0x12, 0x0d, + 0x0c, 0x06, 0x08, 0x15, 0x20, 0x31, 0x25, 0x1e, 0x35, 0x29, 0x17, 0x0e, 0x0d, 0x68, 0x05, 0x17, + 0x17, 0x0d, 0x0b, 0x11, 0x0e, 0x0d, 0x06, 0x09, 0x16, 0x21, 0x33, 0x25, 0x1d, 0x34, 0x26, 0x16, + 0x1c, 0x0b, 0x67, 0x0e, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd8, + 0x02, 0x60, 0x00, 0x1d, 0x00, 0x66, 0xb9, 0x00, 0x15, 0xff, 0xc0, 0x40, 0x40, 0x0d, 0x00, 0x4d, + 0x10, 0x15, 0x20, 0x15, 0x30, 0x15, 0x80, 0x15, 0x90, 0x15, 0x05, 0x15, 0x07, 0x40, 0x0f, 0x00, + 0x4d, 0x07, 0x40, 0x0c, 0x00, 0x4d, 0x6f, 0x07, 0x01, 0x0d, 0x07, 0x01, 0x08, 0x07, 0x1f, 0x60, + 0x1f, 0x01, 0x09, 0x06, 0x51, 0x00, 0x03, 0x50, 0x02, 0x60, 0x02, 0x70, 0x02, 0x03, 0x02, 0x1e, + 0x0f, 0x57, 0x18, 0x07, 0x00, 0x09, 0x55, 0x06, 0x04, 0x05, 0x03, 0x06, 0x0a, 0x00, 0x3f, 0x33, + 0xdd, 0xc5, 0x10, 0xed, 0x32, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xdd, 0x32, 0xed, 0x32, 0x5d, + 0x10, 0xce, 0x5e, 0x5d, 0x5d, 0x2b, 0x2b, 0xc6, 0x5d, 0x2b, 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, + 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x17, + 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x8f, 0x6b, 0x6b, 0x7b, 0xc5, 0xc5, 0x0a, 0x12, 0x1a, + 0x10, 0x11, 0x1d, 0x1b, 0x1d, 0x11, 0x11, 0x22, 0x4f, 0x25, 0x2b, 0x42, 0x2e, 0x18, 0x01, 0x70, + 0x66, 0x76, 0x14, 0x8a, 0x66, 0xbe, 0x1a, 0x20, 0x12, 0x06, 0x02, 0x05, 0x0a, 0x08, 0x6a, 0x0e, + 0x0c, 0x0e, 0x28, 0x49, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x01, 0xd6, 0x00, 0x12, 0x00, 0x32, 0x40, 0x0a, 0x11, 0x51, 0x1f, 0x12, 0x01, 0x12, 0x14, 0x0a, + 0x51, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, 0x10, 0x48, 0x01, 0x09, 0x01, 0x09, 0x13, 0x12, + 0x0a, 0x09, 0x0a, 0x0e, 0x57, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, + 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x11, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x01, 0xb6, 0x22, 0x61, 0x39, 0x3a, + 0x4a, 0x2b, 0x10, 0x7b, 0x1f, 0x2d, 0x1c, 0x1c, 0x7c, 0x10, 0x09, 0x12, 0x20, 0x3b, 0x50, 0x30, + 0x01, 0x06, 0xf6, 0x41, 0x3f, 0x05, 0x01, 0x71, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, + 0x01, 0xd6, 0x00, 0x12, 0x00, 0x50, 0xb9, 0x00, 0x12, 0xff, 0xe0, 0xb3, 0x0f, 0x00, 0x4d, 0x0e, + 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x06, + 0xb8, 0xff, 0xe0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x02, 0xb8, 0xff, 0xe0, 0x40, 0x15, 0x0b, 0x10, + 0x00, 0x4c, 0x0e, 0x12, 0x09, 0x00, 0x04, 0x05, 0x03, 0x0f, 0x14, 0x03, 0x13, 0x0f, 0x0a, 0x03, + 0x0a, 0x00, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xc2, 0x10, 0xce, 0x11, 0x17, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x33, 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, + 0x37, 0x33, 0x06, 0x06, 0x07, 0xc2, 0x2d, 0x5d, 0x2a, 0x81, 0x09, 0x19, 0x1c, 0x1d, 0x0d, 0x0d, + 0x20, 0x1f, 0x1d, 0x09, 0x7d, 0x2a, 0x66, 0x2d, 0x59, 0xef, 0x8e, 0x26, 0x56, 0x57, 0x52, 0x22, + 0x22, 0x52, 0x57, 0x56, 0x26, 0x8e, 0xef, 0x59, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, + 0x01, 0xd6, 0x00, 0x28, 0x01, 0x40, 0xb9, 0x00, 0x28, 0xff, 0xd0, 0xb6, 0x0c, 0x00, 0x4d, 0x60, + 0x28, 0x01, 0x27, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x27, 0xb8, 0xff, 0xd0, 0xb3, 0x0c, + 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0f, 0x00, 0x4d, 0x1d, 0x40, 0x10, 0x00, 0x4d, + 0x1d, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, + 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0f, 0x00, 0x4d, 0x1b, 0x40, 0x10, 0x00, 0x4d, 0x12, 0xb8, + 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x0d, + 0x08, 0x1b, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, + 0xb3, 0x0b, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, + 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x03, 0x40, 0x10, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, + 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xa0, 0xb3, 0x0f, + 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0xb4, 0x0d, 0x0f, 0x00, 0x4c, 0x19, 0xb8, 0xff, 0xc0, 0xb4, + 0x0d, 0x0f, 0x00, 0x4c, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, + 0x40, 0x3e, 0x0d, 0x00, 0x4d, 0x28, 0x60, 0x24, 0x01, 0x24, 0x1f, 0x00, 0x1f, 0x1a, 0x19, 0x05, + 0x11, 0x14, 0x0b, 0x0a, 0x14, 0x20, 0x1f, 0x01, 0x1f, 0x14, 0x05, 0x14, 0x05, 0x1f, 0x03, 0x29, + 0x20, 0x25, 0x60, 0x25, 0x02, 0x25, 0x2a, 0x10, 0x40, 0x0c, 0x00, 0x4d, 0x30, 0x10, 0x01, 0x10, + 0x29, 0x28, 0x06, 0x25, 0x0a, 0x14, 0x1f, 0x05, 0x03, 0x19, 0x19, 0x0b, 0x10, 0x0a, 0x0b, 0x06, + 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x2b, 0x10, + 0xc6, 0x5d, 0x12, 0x17, 0x39, 0x19, 0x2f, 0x18, 0x2f, 0x2f, 0x71, 0x11, 0x33, 0x33, 0x10, 0xc6, + 0x11, 0x33, 0x33, 0x11, 0x33, 0x10, 0xc6, 0x5d, 0x33, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x21, 0x2e, 0x03, 0x27, 0x0e, 0x03, 0x07, 0x23, 0x2e, 0x03, + 0x27, 0x33, 0x16, 0x16, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, + 0x06, 0x06, 0x07, 0x01, 0x42, 0x0b, 0x13, 0x11, 0x11, 0x09, 0x0a, 0x10, 0x11, 0x12, 0x0d, 0x5d, + 0x0c, 0x15, 0x12, 0x0e, 0x06, 0x69, 0x04, 0x09, 0x0c, 0x0d, 0x13, 0x0f, 0x0d, 0x07, 0x59, 0x06, + 0x0d, 0x0f, 0x11, 0x0c, 0x06, 0x08, 0x05, 0x03, 0x02, 0x69, 0x0b, 0x27, 0x18, 0x1f, 0x34, 0x31, + 0x35, 0x20, 0x20, 0x33, 0x32, 0x34, 0x20, 0x2c, 0x6b, 0x79, 0x82, 0x44, 0x57, 0xa6, 0x58, 0x26, + 0x41, 0x3b, 0x37, 0x1d, 0x1d, 0x37, 0x3b, 0x41, 0x26, 0x2e, 0x54, 0x53, 0x53, 0x2d, 0x89, 0xf2, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x01, 0xe1, 0x01, 0xd6, 0x00, 0x17, + 0x00, 0x29, 0x40, 0x17, 0x09, 0x01, 0x03, 0x00, 0x0c, 0x15, 0x17, 0x0f, 0x08, 0x18, 0x08, 0x16, + 0x10, 0x02, 0x08, 0x17, 0x0a, 0x0f, 0x06, 0x09, 0x06, 0x01, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0x01, 0x2f, 0xc6, 0x2f, 0xc6, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x37, 0x33, 0x07, 0x1e, + 0x03, 0x17, 0x23, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x27, 0x33, 0xfe, + 0x60, 0x7d, 0x98, 0x18, 0x2e, 0x2a, 0x22, 0x0c, 0x80, 0x1b, 0x36, 0x18, 0x1e, 0x30, 0x19, 0x7d, + 0x0f, 0x27, 0x2b, 0x2f, 0x16, 0xa5, 0x81, 0x01, 0x43, 0x93, 0xe2, 0x1d, 0x41, 0x42, 0x3c, 0x18, + 0x33, 0x50, 0x20, 0x28, 0x4c, 0x2f, 0x1c, 0x3d, 0x3f, 0x3e, 0x1c, 0xe4, 0x00, 0x01, 0x00, 0x14, + 0xff, 0x58, 0x01, 0xd8, 0x01, 0xd6, 0x00, 0x22, 0x00, 0x2f, 0x40, 0x19, 0x1f, 0x14, 0x01, 0x05, + 0x1d, 0x14, 0x03, 0x18, 0x22, 0x51, 0x00, 0x24, 0x0d, 0x23, 0x18, 0x51, 0x17, 0x17, 0x0a, 0x0e, + 0x11, 0x0a, 0x0f, 0x00, 0x0a, 0x00, 0x3f, 0x3f, 0xdd, 0xc6, 0x3f, 0x01, 0x2f, 0xed, 0x10, 0xc6, + 0x10, 0xd6, 0xed, 0x11, 0x17, 0x39, 0x5d, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, + 0x17, 0x3e, 0x03, 0x37, 0x01, 0xd8, 0x13, 0x23, 0x26, 0x2b, 0x19, 0x13, 0x25, 0x2d, 0x37, 0x25, + 0x1f, 0x33, 0x11, 0x17, 0x14, 0x1f, 0x12, 0x24, 0x2c, 0x0d, 0x2c, 0x58, 0x24, 0x80, 0x09, 0x17, + 0x1a, 0x1d, 0x0f, 0x0a, 0x16, 0x14, 0x13, 0x08, 0x01, 0xd6, 0x42, 0x7f, 0x79, 0x74, 0x37, 0x28, + 0x3a, 0x25, 0x12, 0x0a, 0x08, 0x67, 0x09, 0x07, 0x30, 0x21, 0x58, 0xe3, 0x89, 0x25, 0x54, 0x54, + 0x51, 0x23, 0x23, 0x51, 0x53, 0x54, 0x26, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, + 0x01, 0xd6, 0x00, 0x11, 0x00, 0x57, 0xb5, 0x00, 0x07, 0x10, 0x07, 0x02, 0x07, 0xb8, 0xff, 0xc0, + 0xb5, 0x0d, 0x10, 0x48, 0x07, 0x13, 0x08, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x10, 0x48, 0x08, 0x12, + 0x05, 0x0e, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x09, 0x10, 0x48, 0x0f, 0x00, 0x00, 0x10, 0x00, + 0x40, 0x00, 0x50, 0x00, 0x70, 0x00, 0x05, 0x00, 0x00, 0x11, 0x0a, 0x0f, 0x55, 0x10, 0x0a, 0x08, + 0x06, 0x06, 0x55, 0x07, 0x06, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xcd, 0x01, 0x2f, 0x5d, + 0x2f, 0x2b, 0x39, 0x39, 0x10, 0xc6, 0x2b, 0x10, 0xce, 0x2b, 0x5d, 0x31, 0x30, 0x01, 0x0e, 0x03, + 0x07, 0x33, 0x15, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, 0xaa, 0x0e, 0x34, 0x3d, + 0x3d, 0x18, 0xde, 0xfe, 0x8f, 0x17, 0x36, 0x36, 0x34, 0x15, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x10, + 0x3f, 0x4e, 0x55, 0x24, 0x66, 0x4b, 0x26, 0x50, 0x4d, 0x46, 0x1c, 0x66, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb5, 0x02, 0xbb, 0x00, 0x24, 0x00, 0x37, 0x40, 0x1b, 0x22, 0x6e, 0x17, 0x0e, + 0x1c, 0x09, 0x03, 0x6e, 0x0e, 0x00, 0x12, 0x25, 0x00, 0x00, 0x13, 0x72, 0x12, 0x12, 0x09, 0x1d, + 0x72, 0x1c, 0x10, 0x08, 0x72, 0x09, 0x12, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, + 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, 0xde, 0x32, 0xde, 0xfd, 0xdc, 0xc0, 0x10, 0xd0, 0xed, 0x31, + 0x30, 0x13, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x22, 0x26, 0x35, 0x35, + 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x36, 0x33, 0x33, 0x15, 0x23, + 0x22, 0x06, 0x15, 0x15, 0x14, 0x06, 0xbb, 0x36, 0x2f, 0x18, 0x20, 0x5d, 0x68, 0x5a, 0x45, 0x1a, + 0x1f, 0x36, 0x36, 0x1f, 0x1a, 0x45, 0x5a, 0x68, 0x5d, 0x20, 0x18, 0x2f, 0x01, 0x0a, 0x0a, 0x44, + 0x40, 0x71, 0x2a, 0x26, 0x60, 0x4e, 0x4a, 0x93, 0x2a, 0x2b, 0x60, 0x2b, 0x29, 0x94, 0x4a, 0x4e, + 0x60, 0x25, 0x2b, 0x71, 0x40, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbd, 0xff, 0x5b, 0x01, 0x39, + 0x02, 0xbb, 0x00, 0x03, 0x00, 0x28, 0x40, 0x18, 0x02, 0x80, 0x01, 0x90, 0x01, 0xe0, 0x01, 0x03, + 0x5f, 0x01, 0x01, 0x20, 0x01, 0x40, 0x01, 0x02, 0x01, 0x05, 0x00, 0x04, 0x02, 0x12, 0x00, 0x10, + 0x00, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x5d, 0x5d, 0x5d, 0x32, 0x31, 0x30, 0x13, 0x33, + 0x11, 0x23, 0xbd, 0x7c, 0x7c, 0x02, 0xbb, 0xfc, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb5, 0x02, 0xbb, 0x00, 0x28, 0x00, 0x43, 0x40, 0x25, 0x28, 0x40, 0x0d, 0x00, + 0x4d, 0x01, 0x40, 0x0d, 0x00, 0x4d, 0x10, 0x6e, 0x03, 0x26, 0x6e, 0x19, 0x00, 0x15, 0x2a, 0x20, + 0x09, 0x29, 0x00, 0x00, 0x14, 0x72, 0x15, 0x15, 0x09, 0x21, 0x72, 0x20, 0x12, 0x08, 0x72, 0x09, + 0x10, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, + 0xc6, 0xc6, 0x10, 0xde, 0x32, 0xd6, 0xfd, 0xd0, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x26, 0x26, + 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x14, 0x16, 0x33, + 0x33, 0x15, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, + 0x35, 0x35, 0x34, 0x36, 0x01, 0x39, 0x36, 0x30, 0x18, 0x20, 0x5c, 0x67, 0x2d, 0x3d, 0x25, 0x10, + 0x1a, 0x1f, 0x37, 0x37, 0x1f, 0x1a, 0x10, 0x25, 0x3d, 0x2d, 0x67, 0x5c, 0x20, 0x18, 0x30, 0x01, + 0x0c, 0x0a, 0x44, 0x40, 0x71, 0x2a, 0x26, 0x60, 0x14, 0x26, 0x39, 0x25, 0x93, 0x2a, 0x2b, 0x60, + 0x2b, 0x29, 0x94, 0x25, 0x39, 0x26, 0x14, 0x60, 0x25, 0x2b, 0x71, 0x40, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x15, 0x00, 0xab, 0x01, 0xe7, 0x01, 0x64, 0x00, 0x1f, 0x00, 0x1f, 0x40, 0x0e, + 0x0f, 0x1b, 0x01, 0x1b, 0x0b, 0x20, 0x00, 0x15, 0x10, 0x0a, 0x05, 0x1a, 0x10, 0x83, 0x00, 0x3f, + 0xc4, 0xdd, 0xce, 0x10, 0xd4, 0xc5, 0x01, 0x10, 0xd6, 0xc4, 0x5d, 0x31, 0x30, 0x25, 0x22, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x3e, + 0x02, 0x37, 0x17, 0x0e, 0x03, 0x01, 0x59, 0x1b, 0x2f, 0x2c, 0x29, 0x13, 0x08, 0x0f, 0x0e, 0x0c, + 0x06, 0x5b, 0x04, 0x14, 0x21, 0x32, 0x23, 0x1a, 0x2f, 0x2c, 0x28, 0x14, 0x08, 0x0f, 0x0e, 0x0d, + 0x06, 0x5b, 0x05, 0x13, 0x22, 0x31, 0xab, 0x15, 0x1a, 0x15, 0x04, 0x0d, 0x1a, 0x16, 0x19, 0x19, + 0x37, 0x2e, 0x1f, 0x15, 0x1a, 0x15, 0x04, 0x0e, 0x1a, 0x16, 0x19, 0x19, 0x37, 0x2f, 0x1f, 0x00, + 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf4, 0x01, 0xde, 0x02, 0x77, 0x00, 0x2e, 0x00, 0x76, 0xb9, 0x00, + 0x1e, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1c, + 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xa0, 0x40, 0x2d, 0x0d, 0x00, 0x4d, + 0x20, 0x06, 0x30, 0x2d, 0x29, 0x2b, 0x18, 0x17, 0x17, 0x0f, 0x0e, 0x19, 0x0d, 0x16, 0x63, 0x28, + 0x00, 0x2b, 0x2f, 0x1f, 0x1c, 0x4a, 0x23, 0x09, 0x29, 0x18, 0x73, 0x2a, 0x17, 0x2d, 0x0f, 0x73, + 0x2e, 0x9f, 0x0e, 0x01, 0x0e, 0x07, 0x0a, 0x4a, 0x03, 0x02, 0x00, 0x3f, 0xfd, 0xc6, 0xd6, 0x5d, + 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd4, 0x32, 0x32, 0xfd, + 0x32, 0x32, 0xcc, 0x32, 0x32, 0x11, 0x33, 0x10, 0xcd, 0x32, 0x10, 0xce, 0xce, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x33, 0x07, 0x23, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x33, 0x07, 0x23, 0x16, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x64, 0x17, 0x7c, 0x59, 0x1d, 0x40, 0x22, 0x1b, 0x12, 0x2f, 0x1d, 0x33, 0x34, 0x0b, + 0xb6, 0x11, 0xb1, 0x01, 0x01, 0x01, 0x01, 0xa6, 0x11, 0x89, 0x0c, 0x3c, 0x25, 0x1a, 0x3e, 0x1b, + 0x1a, 0x1f, 0x4b, 0x26, 0x2a, 0x4e, 0x3f, 0x2d, 0x0a, 0x41, 0x39, 0x39, 0x01, 0xab, 0x67, 0x65, + 0x08, 0x0e, 0x66, 0x08, 0x09, 0x34, 0x2d, 0x54, 0x08, 0x0f, 0x08, 0x08, 0x10, 0x08, 0x54, 0x35, + 0x2f, 0x0a, 0x0d, 0x63, 0x0f, 0x11, 0x17, 0x31, 0x4f, 0x39, 0x54, 0x3f, 0x54, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x7e, 0xff, 0x67, 0x01, 0x5b, 0x00, 0xa7, 0x00, 0x13, 0x00, 0x18, 0x40, 0x0a, + 0x0e, 0x7a, 0x08, 0x05, 0x00, 0x14, 0x0b, 0x00, 0x13, 0x0f, 0x00, 0x3f, 0xc5, 0xc4, 0x01, 0x10, + 0xd6, 0xce, 0xd6, 0xed, 0x31, 0x30, 0x17, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x7e, 0x12, 0x25, 0x21, 0x1a, 0x08, 0x26, 0x2a, 0x33, + 0x27, 0x2a, 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x49, 0x04, 0x06, 0x0c, 0x16, 0x13, 0x04, 0x34, 0x20, + 0x27, 0x32, 0x38, 0x30, 0x23, 0x46, 0x3c, 0x2c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, + 0xff, 0x56, 0x01, 0xec, 0x02, 0xb5, 0x00, 0x29, 0x00, 0x33, 0x40, 0x1a, 0x28, 0x1c, 0x2b, 0x26, + 0x29, 0x51, 0x13, 0x10, 0x52, 0x11, 0x08, 0x2a, 0x10, 0x28, 0x55, 0x12, 0x27, 0x20, 0x57, 0x19, + 0x01, 0x09, 0x0c, 0x55, 0x05, 0x0f, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xd6, 0x32, 0xed, 0x32, + 0x01, 0x10, 0xc6, 0xd6, 0xfd, 0x32, 0xed, 0x32, 0x10, 0xc6, 0xce, 0x31, 0x30, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x15, 0x33, 0x15, 0x23, 0x01, 0x07, 0x1c, 0x32, 0x43, 0x27, 0x1d, 0x22, 0x11, 0x1c, 0x08, 0x13, + 0x14, 0x1f, 0x22, 0x67, 0x67, 0x21, 0x38, 0x48, 0x26, 0x27, 0x52, 0x21, 0x15, 0x17, 0x45, 0x1f, + 0x11, 0x1f, 0x17, 0x0e, 0xc1, 0xc1, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x08, 0x05, 0x66, 0x02, 0x05, + 0x25, 0x32, 0x01, 0x57, 0x66, 0x1b, 0x39, 0x4b, 0x2d, 0x13, 0x0e, 0x10, 0x64, 0x08, 0x11, 0x06, + 0x14, 0x25, 0x1e, 0x19, 0x66, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0xff, 0x70, 0x01, 0xc3, + 0x00, 0x83, 0x00, 0x13, 0x00, 0x27, 0x00, 0x22, 0x40, 0x0f, 0x22, 0x19, 0x1c, 0x27, 0x0e, 0x05, + 0x08, 0x00, 0x28, 0x14, 0x27, 0x0f, 0x00, 0x13, 0x0f, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x01, 0x10, + 0xd6, 0xd6, 0xcd, 0xdd, 0xc4, 0xd6, 0xcd, 0xcd, 0x31, 0x30, 0x17, 0x3e, 0x03, 0x37, 0x26, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x37, 0x3e, 0x03, 0x37, 0x26, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0c, 0x13, 0x25, 0x1f, + 0x19, 0x07, 0x21, 0x21, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0xda, 0x13, 0x25, 0x20, + 0x19, 0x07, 0x22, 0x20, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0x4d, 0x04, 0x08, 0x0d, + 0x17, 0x12, 0x03, 0x2b, 0x1a, 0x23, 0x23, 0x33, 0x24, 0x1d, 0x40, 0x36, 0x26, 0x03, 0x43, 0x04, + 0x08, 0x0d, 0x17, 0x12, 0x03, 0x2b, 0x1a, 0x23, 0x23, 0x33, 0x24, 0x1d, 0x40, 0x36, 0x26, 0x03, + 0x00, 0x03, 0x00, 0x1c, 0xff, 0xf4, 0x01, 0xdb, 0x00, 0x77, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, + 0x00, 0x49, 0x40, 0x2f, 0x09, 0x40, 0x0e, 0x00, 0x4d, 0x4f, 0x09, 0x01, 0x09, 0x79, 0x0f, 0x03, + 0x1f, 0x03, 0x02, 0x03, 0x4f, 0x15, 0x5f, 0x15, 0x02, 0x15, 0x79, 0x0f, 0x0f, 0x01, 0x0f, 0x4f, + 0x21, 0x5f, 0x21, 0x02, 0x21, 0x79, 0x1b, 0x24, 0x06, 0x12, 0x12, 0x1e, 0x74, 0x18, 0x09, 0x0c, + 0x09, 0x00, 0x09, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x32, 0x11, 0x33, 0x01, 0x10, 0xd6, 0xfd, 0x5d, + 0xd6, 0x5d, 0xfd, 0x5d, 0xd6, 0x5d, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, + 0xa1, 0x1c, 0x1e, 0x1e, 0x1c, 0x1c, 0x1e, 0x1d, 0xc2, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x1f, 0x1e, + 0xc2, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x1f, 0x1e, 0x0c, 0x29, 0x19, 0x19, 0x28, 0x29, 0x18, 0x19, + 0x29, 0x29, 0x19, 0x19, 0x28, 0x29, 0x18, 0x19, 0x29, 0x29, 0x19, 0x19, 0x28, 0x29, 0x18, 0x19, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e, 0xff, 0x7f, 0x01, 0xb8, 0x02, 0x6b, 0x00, 0x11, + 0x00, 0x3a, 0x40, 0x20, 0x10, 0x0f, 0x00, 0x52, 0x0c, 0x0b, 0x40, 0x09, 0x50, 0x09, 0x80, 0x09, + 0x90, 0x09, 0x04, 0x09, 0x09, 0x13, 0x12, 0x00, 0x09, 0x55, 0x0f, 0x0c, 0x0c, 0x0d, 0x04, 0x13, + 0x0d, 0x02, 0x05, 0x88, 0x00, 0x3f, 0x3f, 0x10, 0xce, 0x11, 0x39, 0x2f, 0xc0, 0xfd, 0xc0, 0x01, + 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x33, 0xfd, 0x32, 0xcd, 0x31, 0x30, 0x01, 0x15, 0x14, 0x06, + 0x07, 0x23, 0x26, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x01, 0x31, + 0x08, 0x09, 0x4b, 0x08, 0x09, 0x86, 0x86, 0x6d, 0x87, 0x01, 0x50, 0xcc, 0x48, 0x7b, 0x42, 0x41, + 0x7c, 0x48, 0xcc, 0x66, 0xb5, 0xb5, 0x66, 0x00, 0x00, 0x01, 0x00, 0x3a, 0xff, 0x7f, 0x01, 0xb5, + 0x02, 0x6b, 0x00, 0x17, 0x00, 0x6c, 0xb9, 0x00, 0x17, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x16, + 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x12, + 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x1a, 0x00, 0x4d, 0x19, 0x13, 0x17, 0x15, 0x11, 0x00, 0x52, 0x0e, + 0x0b, 0x0a, 0x07, 0x0c, 0x30, 0x08, 0x40, 0x08, 0x50, 0x08, 0x03, 0x08, 0x18, 0x00, 0x07, 0x72, + 0x15, 0x0a, 0x14, 0x0b, 0x72, 0x11, 0x5f, 0x0e, 0x6f, 0x0e, 0x02, 0x0e, 0x7b, 0x0f, 0x02, 0x03, + 0x88, 0x00, 0x3f, 0x3f, 0xfd, 0x5d, 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0x5d, 0x32, 0xd5, 0x32, 0x32, 0x32, 0xfd, 0x32, 0x32, 0xd5, 0x32, 0xc6, 0x31, 0x30, 0x2b, 0x2b, + 0x2b, 0x2b, 0x25, 0x06, 0x06, 0x07, 0x23, 0x26, 0x26, 0x27, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, + 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x01, 0x2e, 0x02, 0x08, 0x08, 0x4a, + 0x08, 0x09, 0x01, 0x86, 0x86, 0x86, 0x86, 0x6e, 0x87, 0x87, 0x87, 0x62, 0x3d, 0x6c, 0x3a, 0x39, + 0x6d, 0x3d, 0x67, 0x87, 0x66, 0xb5, 0xb5, 0x66, 0x87, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, + 0x01, 0xfe, 0x01, 0x86, 0x02, 0xb3, 0x00, 0x05, 0x00, 0x40, 0x40, 0x22, 0x02, 0x40, 0x0d, 0x00, + 0x4d, 0x02, 0x20, 0x0c, 0x00, 0x4d, 0x2b, 0x02, 0x01, 0x04, 0x03, 0x06, 0x02, 0x01, 0x00, 0x05, + 0x07, 0x02, 0x05, 0x02, 0x05, 0x06, 0x07, 0x02, 0x72, 0x05, 0x03, 0x03, 0x01, 0x7e, 0x00, 0x3f, + 0x33, 0x10, 0xdd, 0xed, 0x01, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, + 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x2b, 0x01, 0x07, 0x27, 0x07, 0x27, 0x37, + 0x01, 0x86, 0x31, 0x59, 0x59, 0x33, 0x8c, 0x02, 0x39, 0x3b, 0x45, 0x45, 0x3b, 0x7a, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xeb, 0x02, 0x79, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x4b, 0x01, 0x15, 0xb9, 0x00, 0x3e, 0xff, 0xc0, 0x40, + 0x13, 0x18, 0x00, 0x4d, 0x3c, 0x40, 0x18, 0x00, 0x4d, 0x38, 0x20, 0x18, 0x00, 0x4d, 0x38, 0x58, + 0x16, 0x00, 0x4d, 0x36, 0xb8, 0xff, 0xe0, 0xb3, 0x18, 0x00, 0x4d, 0x36, 0xb8, 0xff, 0xc0, 0xb3, + 0x16, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x18, 0x00, 0x4d, 0xc4, 0x22, 0x01, 0x20, + 0x40, 0x18, 0x00, 0x4d, 0xcc, 0x20, 0x01, 0x1c, 0x20, 0x18, 0x00, 0x4d, 0xcb, 0x1c, 0x01, 0x1a, + 0xb8, 0xff, 0xc0, 0xb6, 0x18, 0x00, 0x4d, 0xc4, 0x1a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x17, + 0x18, 0x00, 0x4d, 0xc4, 0x0a, 0x01, 0x08, 0x40, 0x18, 0x00, 0x4d, 0xcb, 0x08, 0x01, 0x04, 0x40, + 0x18, 0x00, 0x4d, 0xcb, 0x04, 0x01, 0x02, 0xb8, 0xff, 0xc0, 0xb6, 0x18, 0x00, 0x4d, 0xc4, 0x02, + 0x01, 0x24, 0xb8, 0xff, 0xe0, 0x40, 0x4b, 0x0e, 0x10, 0x00, 0x4c, 0x0f, 0x00, 0x1f, 0x00, 0x02, + 0x00, 0x7f, 0x12, 0x0c, 0x7f, 0x06, 0x18, 0x7f, 0x1f, 0x2e, 0x01, 0x2e, 0x28, 0x7f, 0x1e, 0x26, + 0x27, 0x4d, 0x10, 0x3a, 0x01, 0x3a, 0x7f, 0x40, 0x46, 0x7f, 0x34, 0x25, 0x4c, 0x2b, 0x80, 0x27, + 0x26, 0x37, 0x1b, 0x1b, 0x21, 0x37, 0x3d, 0x80, 0x49, 0x0f, 0x80, 0x03, 0x49, 0x37, 0x25, 0x24, + 0x03, 0x25, 0x03, 0x25, 0x03, 0x09, 0x43, 0x80, 0x37, 0x03, 0x31, 0x80, 0x21, 0x07, 0x15, 0x80, + 0x09, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x39, + 0x11, 0x12, 0x39, 0x10, 0xed, 0x10, 0xed, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0xed, 0x01, + 0x10, 0xd6, 0xd6, 0xfd, 0xd6, 0xed, 0x5d, 0x10, 0xd6, 0xc5, 0xd6, 0xfd, 0xd6, 0x5d, 0xfd, 0xd6, + 0xfd, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, + 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x25, 0x27, 0x25, 0x17, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x4f, 0x30, 0x2e, 0x30, 0x30, + 0x30, 0x30, 0x2e, 0x30, 0x7b, 0x0e, 0x0f, 0x0e, 0x0d, 0x0d, 0x0e, 0x0f, 0x0e, 0x5f, 0x30, 0x2f, + 0x30, 0x30, 0x30, 0x30, 0x2f, 0x30, 0xfe, 0xf9, 0x19, 0x01, 0xc9, 0x19, 0x46, 0x0e, 0x0f, 0x0f, + 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0xfe, 0x68, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x7b, + 0x0e, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x7c, 0x43, 0x47, 0x47, 0x43, 0x43, 0x46, 0x46, + 0x43, 0x24, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, 0x24, 0x43, 0x47, 0x47, 0x43, 0x43, 0x46, 0x46, + 0xaf, 0x2c, 0xe5, 0x2d, 0xfe, 0xb0, 0x24, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, 0x01, 0x98, 0x43, + 0x46, 0x46, 0x43, 0x44, 0x46, 0x46, 0x44, 0x24, 0x1f, 0x1f, 0x24, 0x25, 0x1f, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x2f, 0x33, + 0x2b, 0x24, 0x50, 0x01, 0x11, 0x34, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x84, + 0x00, 0x27, 0x01, 0x7c, 0x01, 0xd4, 0x00, 0x05, 0x00, 0x38, 0xb9, 0x00, 0x00, 0xff, 0xc0, 0xb3, + 0x10, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0a, 0x00, 0x4d, 0x05, 0x01, 0x00, 0x03, + 0x06, 0x05, 0x04, 0x00, 0x01, 0x03, 0x03, 0x02, 0x04, 0x0b, 0x02, 0x07, 0x00, 0x3f, 0x3f, 0x12, + 0x39, 0x3d, 0x2f, 0x39, 0x39, 0x12, 0x39, 0x01, 0x18, 0x10, 0xde, 0xdd, 0xdd, 0xc0, 0x31, 0x30, + 0x2b, 0x2b, 0x25, 0x17, 0x07, 0x27, 0x37, 0x17, 0x01, 0x21, 0x5b, 0x65, 0x93, 0x93, 0x65, 0xfe, + 0xa7, 0x30, 0xd7, 0xd6, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xfb, 0x01, 0xeb, + 0x02, 0x71, 0x00, 0x16, 0x00, 0x25, 0x00, 0x6e, 0x40, 0x4b, 0x12, 0x40, 0x0c, 0x00, 0x4d, 0x10, + 0x40, 0x0c, 0x00, 0x4d, 0x0f, 0x10, 0x19, 0x44, 0x2f, 0x14, 0x3f, 0x14, 0x02, 0x14, 0x44, 0x0f, + 0x12, 0x1f, 0x12, 0x2f, 0x12, 0x03, 0x12, 0x3f, 0x15, 0x4f, 0x15, 0x5f, 0x15, 0x03, 0x15, 0x3f, + 0x0d, 0x4f, 0x0d, 0x5f, 0x0d, 0x03, 0x0d, 0x27, 0x20, 0x21, 0x01, 0x21, 0x53, 0x06, 0x26, 0x14, + 0x48, 0x16, 0x08, 0x13, 0x48, 0x4f, 0x11, 0x01, 0x11, 0x0f, 0x48, 0x0d, 0x02, 0x1c, 0x4a, 0x09, + 0x02, 0x17, 0x4a, 0x03, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xfd, 0xd6, 0x5d, 0xed, 0x3f, + 0xed, 0x01, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xce, 0x5d, 0xde, 0x5d, 0xce, 0x5d, 0xfd, 0x5d, 0xed, + 0xd0, 0xc0, 0x31, 0x30, 0x2b, 0x2b, 0x21, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x25, 0x32, 0x37, + 0x11, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x13, 0x0c, 0x19, 0x0e, 0x65, + 0x69, 0x6b, 0x62, 0x0f, 0x1c, 0x0e, 0xc6, 0x6f, 0x58, 0x58, 0x7c, 0xfe, 0xf4, 0x11, 0x0f, 0x0f, + 0x11, 0x1c, 0x23, 0x13, 0x07, 0x06, 0x14, 0x22, 0x03, 0x02, 0x95, 0xa6, 0xa5, 0x96, 0x04, 0x02, + 0x66, 0x8a, 0x66, 0xaf, 0x66, 0x66, 0x05, 0x01, 0x96, 0x05, 0x1d, 0x36, 0x4d, 0x30, 0x30, 0x4d, + 0x36, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x01, 0x8f, 0x01, 0x6d, 0x02, 0xcf, 0x00, 0x13, + 0x00, 0x16, 0x40, 0x09, 0x05, 0x00, 0x08, 0x7a, 0x0e, 0x14, 0x0b, 0x13, 0x8a, 0x00, 0x3f, 0xc4, + 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xce, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x01, 0x6d, 0x12, 0x24, 0x21, 0x1b, 0x08, + 0x26, 0x2a, 0x33, 0x27, 0x2a, 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x02, 0x7f, 0x03, 0x07, 0x0c, 0x16, + 0x13, 0x03, 0x35, 0x20, 0x27, 0x32, 0x38, 0x30, 0x22, 0x47, 0x3c, 0x2c, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x90, 0x01, 0x9f, 0x01, 0x6d, 0x02, 0xdf, 0x00, 0x13, 0x00, 0x20, 0x40, 0x12, + 0x07, 0x40, 0x0b, 0x00, 0x4d, 0x07, 0x40, 0x09, 0x00, 0x4d, 0x0e, 0x7a, 0x08, 0x00, 0x14, 0x0b, + 0x13, 0xa3, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x3e, + 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x90, + 0x12, 0x25, 0x21, 0x1a, 0x08, 0x26, 0x2a, 0x33, 0x27, 0x2a, 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x01, + 0xef, 0x04, 0x06, 0x0c, 0x16, 0x13, 0x04, 0x34, 0x20, 0x27, 0x32, 0x38, 0x30, 0x23, 0x46, 0x3c, + 0x2c, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0x01, 0x9d, 0x01, 0xe0, 0x02, 0xb1, 0x00, 0x13, + 0x00, 0x27, 0x00, 0x26, 0x40, 0x12, 0x05, 0x00, 0x08, 0x0f, 0x0e, 0x01, 0x0e, 0x19, 0x14, 0x1c, + 0x22, 0x28, 0x27, 0x1f, 0xa3, 0x13, 0x0b, 0xa3, 0x00, 0x3f, 0xc4, 0x3f, 0xc4, 0x01, 0x10, 0xd6, + 0xdd, 0xd6, 0xce, 0xd6, 0x5d, 0xdd, 0xd6, 0xce, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x07, 0x0e, 0x03, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x01, 0xe0, 0x13, 0x24, + 0x20, 0x19, 0x07, 0x21, 0x21, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0xda, 0x13, 0x25, + 0x20, 0x19, 0x07, 0x22, 0x20, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0x02, 0x6e, 0x04, + 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, 0x23, 0x24, 0x34, 0x24, 0x1d, 0x40, 0x36, 0x26, 0x03, + 0x43, 0x04, 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, 0x23, 0x24, 0x34, 0x24, 0x1d, 0x40, 0x36, + 0x26, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1d, 0x01, 0xbf, 0x01, 0xd5, 0x02, 0xd2, 0x00, 0x13, + 0x00, 0x27, 0x00, 0x2e, 0x40, 0x19, 0x22, 0x95, 0x19, 0x1c, 0x20, 0x14, 0x30, 0x14, 0x02, 0x14, + 0x0e, 0x95, 0x05, 0x08, 0x90, 0x00, 0x01, 0x00, 0x28, 0x27, 0x1f, 0x8a, 0x13, 0x0b, 0x8a, 0x00, + 0x3f, 0xc4, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0xcd, 0xfd, 0xde, 0x5d, 0xd6, 0xcd, 0xed, + 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x37, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x0e, 0x02, 0x07, 0x1d, 0x13, 0x25, 0x20, 0x19, 0x07, 0x22, 0x20, 0x2e, 0x1b, 0x27, 0x26, + 0x18, 0x2e, 0x46, 0x2e, 0xda, 0x13, 0x25, 0x20, 0x19, 0x07, 0x22, 0x20, 0x2d, 0x1c, 0x27, 0x26, + 0x18, 0x2f, 0x45, 0x2e, 0x02, 0x01, 0x04, 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, 0x23, 0x24, + 0x34, 0x24, 0x1d, 0x40, 0x36, 0x25, 0x03, 0x42, 0x04, 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, + 0x23, 0x24, 0x34, 0x24, 0x1d, 0x40, 0x36, 0x25, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, + 0x00, 0xab, 0x01, 0x82, 0x01, 0xc9, 0x00, 0x13, 0x00, 0x15, 0x40, 0x09, 0x0f, 0x00, 0x01, 0x00, + 0x0a, 0x14, 0x05, 0x0f, 0x0b, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x01, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x01, + 0x82, 0x13, 0x23, 0x33, 0x1f, 0x20, 0x32, 0x23, 0x13, 0x13, 0x23, 0x32, 0x20, 0x1f, 0x33, 0x23, + 0x13, 0x01, 0x3a, 0x1d, 0x33, 0x28, 0x17, 0x17, 0x28, 0x33, 0x1d, 0x1c, 0x34, 0x28, 0x17, 0x17, + 0x28, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0xdd, 0x01, 0xbf, 0x01, 0x39, 0x00, 0x03, + 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x03, 0x00, 0x94, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xcd, + 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x36, 0x01, 0x89, 0xfe, 0x77, 0x01, 0x39, 0x5c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xdd, 0x01, 0xf4, 0x01, 0x39, 0x00, 0x03, 0x00, 0x12, 0xb6, 0x02, + 0x05, 0x03, 0x04, 0x02, 0x00, 0x94, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xc0, 0x10, 0xc0, 0x31, 0x30, + 0x11, 0x21, 0x15, 0x21, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0x39, 0x5c, 0x00, 0x00, 0x01, 0x00, 0x5a, + 0x02, 0x17, 0x01, 0x9e, 0x02, 0xa0, 0x00, 0x1b, 0x00, 0x9d, 0xb9, 0x00, 0x11, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xe0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0f, 0xb8, 0xff, 0xe0, + 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0e, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x0e, 0xb8, 0xff, + 0xa0, 0xb3, 0x0b, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0d, 0xb8, + 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0x40, 0x25, 0x09, 0x00, 0x4d, 0x0a, + 0x18, 0x13, 0x05, 0x0d, 0x13, 0x05, 0x1b, 0x1b, 0x05, 0x13, 0x0d, 0x04, 0x1c, 0x00, 0x1d, 0x00, + 0x0e, 0x10, 0x0e, 0x30, 0x0e, 0x03, 0x0e, 0x1c, 0x1b, 0x82, 0x05, 0x18, 0x13, 0x0d, 0x0a, 0x13, + 0x82, 0x00, 0x3f, 0xd5, 0xc6, 0x10, 0xdc, 0xc5, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x10, 0xce, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0x9e, 0x05, + 0x13, 0x1b, 0x22, 0x14, 0x10, 0x1b, 0x1b, 0x1b, 0x0f, 0x11, 0x17, 0x08, 0x3b, 0x05, 0x13, 0x1b, + 0x22, 0x15, 0x10, 0x1b, 0x1b, 0x1a, 0x0f, 0x11, 0x18, 0x07, 0x02, 0x79, 0x0e, 0x1f, 0x1c, 0x12, + 0x0a, 0x0b, 0x0a, 0x17, 0x0f, 0x27, 0x0e, 0x20, 0x1c, 0x12, 0x0a, 0x0b, 0x0a, 0x16, 0x0f, 0x00, + 0x00, 0x02, 0x00, 0x12, 0x01, 0x65, 0x01, 0xdc, 0x02, 0x6b, 0x00, 0x07, 0x00, 0x24, 0x00, 0x8e, + 0x40, 0x56, 0x10, 0x0e, 0x01, 0x0c, 0x24, 0x01, 0x23, 0x24, 0x1d, 0x08, 0x09, 0x0f, 0x0f, 0x16, + 0x01, 0x16, 0x16, 0x1d, 0x0f, 0x0e, 0x01, 0x0e, 0x82, 0x0f, 0x0f, 0x01, 0x0f, 0x0f, 0x01, 0x01, + 0x01, 0x82, 0x02, 0x82, 0x00, 0x06, 0x01, 0x06, 0x82, 0x04, 0x25, 0x1e, 0x82, 0x2f, 0x1d, 0x01, + 0x1f, 0x1d, 0x01, 0x00, 0x1d, 0x01, 0x2f, 0x1d, 0x01, 0x1d, 0x23, 0x24, 0x24, 0x18, 0x10, 0x1d, + 0x01, 0x1d, 0x83, 0x18, 0x02, 0x09, 0x14, 0x08, 0x08, 0x0e, 0x14, 0x02, 0x0e, 0x83, 0x10, 0x03, + 0x01, 0x03, 0x83, 0x06, 0x02, 0x81, 0x00, 0x02, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0x5d, 0x3f, 0x3f, + 0x12, 0x39, 0x2f, 0x12, 0x39, 0x3f, 0x3f, 0x5d, 0x12, 0x39, 0x2f, 0x39, 0x01, 0x2f, 0x5d, 0x71, + 0x71, 0x72, 0xed, 0x10, 0xde, 0xee, 0x71, 0xfd, 0xfd, 0x71, 0xd6, 0x71, 0xed, 0x5d, 0x12, 0x39, + 0x3d, 0x2f, 0x5d, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x5d, 0x31, 0x30, 0x00, 0x5d, 0x13, 0x15, + 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x05, 0x27, 0x0e, 0x03, 0x15, 0x23, 0x3e, 0x03, 0x37, 0x33, + 0x17, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x23, 0x34, 0x2e, 0x02, 0x27, 0x07, 0xcc, 0x40, 0x3a, 0x40, + 0x01, 0x34, 0x27, 0x02, 0x02, 0x01, 0x01, 0x3a, 0x03, 0x06, 0x07, 0x07, 0x05, 0x36, 0x2c, 0x2f, + 0x36, 0x05, 0x07, 0x06, 0x05, 0x03, 0x3a, 0x01, 0x01, 0x02, 0x01, 0x2a, 0x02, 0x6b, 0x32, 0xd4, + 0xd4, 0x32, 0xc1, 0x74, 0x14, 0x3c, 0x39, 0x2c, 0x04, 0x32, 0x4a, 0x3c, 0x33, 0x1b, 0x88, 0x88, + 0x1b, 0x34, 0x3c, 0x4a, 0x31, 0x04, 0x2c, 0x39, 0x3c, 0x14, 0x74, 0x00, 0xff, 0xff, 0x00, 0x36, + 0xff, 0xf5, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, 0x32, 0x36, 0x2e, 0x25, 0x50, 0x01, 0x11, 0x37, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x9b, 0x00, 0x27, 0x01, 0x93, 0x01, 0xd4, 0x00, 0x05, + 0x00, 0x5c, 0xb5, 0x04, 0x28, 0x10, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xf8, 0xb3, 0x0b, 0x00, 0x4d, + 0x04, 0xb8, 0xff, 0xe0, 0xb3, 0x09, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xd8, 0x40, 0x1e, 0x0b, 0x00, + 0x4d, 0x00, 0x20, 0x0f, 0x00, 0x4d, 0x00, 0x04, 0x05, 0x02, 0x07, 0x01, 0x03, 0x06, 0x07, 0x04, + 0x03, 0x02, 0x00, 0x05, 0x01, 0x03, 0x05, 0x03, 0x05, 0x07, 0x01, 0x7e, 0x00, 0x3f, 0x12, 0x39, + 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, + 0x10, 0xd6, 0xdd, 0xdd, 0xc0, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x37, + 0x17, 0x07, 0x27, 0x37, 0x9b, 0x65, 0x93, 0x93, 0x65, 0x5b, 0x01, 0xa5, 0x2f, 0xd6, 0xd7, 0x30, + 0xa7, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x16, 0xff, 0xf5, 0x01, 0xe8, 0x01, 0xe2, 0x00, 0x26, + 0x00, 0x32, 0x00, 0x3d, 0x00, 0x70, 0xb9, 0x00, 0x0f, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x0e, + 0xb8, 0xff, 0xc0, 0x40, 0x3b, 0x09, 0x00, 0x4d, 0x35, 0x40, 0x0d, 0x00, 0x4d, 0x20, 0x2d, 0x30, + 0x2d, 0x02, 0x27, 0x2d, 0x12, 0x38, 0x39, 0x39, 0x38, 0x12, 0x2d, 0x27, 0x05, 0x3e, 0x1b, 0x0e, + 0x3f, 0x00, 0x3e, 0x2a, 0x57, 0x24, 0x07, 0x70, 0x12, 0x80, 0x12, 0x02, 0x12, 0x39, 0x39, 0x09, + 0x1a, 0x17, 0x57, 0x1e, 0x07, 0x30, 0x33, 0x01, 0x33, 0x57, 0x09, 0x0b, 0x30, 0x57, 0x03, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x5d, 0x3f, 0xfd, 0xc6, 0x12, 0x39, 0x2f, 0xc5, 0x5d, 0x3f, 0xed, + 0x01, 0x10, 0xc6, 0x10, 0xc6, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x31, + 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x23, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x37, 0x22, 0x0e, 0x02, 0x15, 0x33, 0x34, 0x2e, 0x02, 0x16, + 0x4d, 0x42, 0x1c, 0x35, 0x11, 0x13, 0x2e, 0x1a, 0x1d, 0x31, 0x24, 0x14, 0x01, 0x01, 0xb3, 0x01, + 0x0e, 0x16, 0x1c, 0x10, 0x12, 0x23, 0x0e, 0x12, 0x17, 0x2d, 0x1e, 0x29, 0x36, 0x11, 0x0f, 0x30, + 0x23, 0x49, 0x46, 0x5e, 0x1d, 0x14, 0x14, 0x1c, 0x1d, 0x14, 0x14, 0x1c, 0xee, 0x0d, 0x11, 0x0b, + 0x05, 0x58, 0x04, 0x09, 0x10, 0xec, 0x7e, 0x78, 0x21, 0x20, 0x1f, 0x22, 0x18, 0x36, 0x58, 0x40, + 0x0c, 0x25, 0x08, 0x1c, 0x27, 0x19, 0x0b, 0x09, 0x08, 0x61, 0x0c, 0x0b, 0x25, 0x1a, 0x1a, 0x25, + 0x7e, 0x79, 0x50, 0x40, 0x3f, 0x51, 0x50, 0x40, 0x3f, 0x43, 0x13, 0x1e, 0x25, 0x12, 0x13, 0x26, + 0x1d, 0x12, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x02, 0x01, 0x01, 0x17, 0x29, 0x11, 0x06, 0x50, 0x02, 0x05, 0x21, 0x4f, 0x01, 0x05, 0x15, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x5b, 0x01, 0x4d, + 0x01, 0xd1, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x23, 0x40, 0x12, 0x14, 0x71, 0x0e, 0x0b, 0x6f, 0x00, + 0x1a, 0x06, 0x17, 0x75, 0x0d, 0x11, 0x01, 0x01, 0x11, 0x7f, 0x0c, 0x12, 0x00, 0x3f, 0x3f, 0x5f, + 0x5d, 0xfd, 0xce, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x17, 0x34, 0x3e, 0x02, 0x37, + 0x33, 0x1e, 0x03, 0x15, 0x15, 0x23, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x22, 0x26, 0xb3, 0x03, 0x05, 0x07, 0x04, 0x66, 0x04, 0x08, 0x06, 0x03, 0x8e, 0x0c, 0x33, 0x20, + 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x01, 0x24, 0x39, 0x34, 0x34, 0x20, 0x20, 0x34, 0x34, 0x39, + 0x24, 0xa4, 0x02, 0x24, 0x27, 0x2b, 0x2b, 0x27, 0x27, 0x2b, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x2e, + 0xff, 0x9f, 0x01, 0xc7, 0x02, 0x6a, 0x00, 0x21, 0x00, 0x5b, 0xb9, 0x00, 0x1d, 0xff, 0xc0, 0x40, + 0x32, 0x0b, 0x00, 0x4d, 0x09, 0x00, 0x17, 0x01, 0x17, 0x23, 0x1f, 0x1b, 0x01, 0x1b, 0x51, 0x1c, + 0x00, 0x1f, 0x06, 0x01, 0x06, 0x51, 0x04, 0x10, 0x53, 0x20, 0x00, 0x30, 0x00, 0x50, 0x00, 0x03, + 0x00, 0x22, 0x1b, 0x1a, 0x1d, 0x57, 0x13, 0x13, 0x22, 0x04, 0x0a, 0x0d, 0x57, 0x06, 0x03, 0x05, + 0x02, 0x04, 0x02, 0x00, 0x3f, 0x3f, 0xdd, 0x32, 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0xfd, 0x32, + 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x5d, 0x10, 0xd4, 0xed, 0x5d, 0x10, 0xd6, 0x5d, + 0xc6, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x17, 0x07, + 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, + 0x15, 0x23, 0x35, 0x2e, 0x03, 0x2e, 0x59, 0x60, 0x7c, 0x18, 0x2d, 0x17, 0x1a, 0x13, 0x2f, 0x24, + 0x53, 0x40, 0x45, 0x53, 0x1d, 0x3c, 0x19, 0x11, 0x13, 0x32, 0x1f, 0x7c, 0x30, 0x46, 0x2d, 0x16, + 0x01, 0x06, 0x55, 0x7b, 0x14, 0x80, 0x7b, 0x02, 0x0c, 0x09, 0x68, 0x07, 0x0b, 0x3f, 0x3d, 0x3c, + 0x40, 0x08, 0x08, 0x6a, 0x08, 0x0a, 0x02, 0x7d, 0x82, 0x09, 0x2a, 0x3c, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x77, 0x00, 0x23, 0x00, 0x59, 0x40, 0x14, + 0x1b, 0x09, 0x01, 0x1a, 0x25, 0x00, 0x03, 0x6e, 0x11, 0x0e, 0x0f, 0x0b, 0x1f, 0x0b, 0x02, 0x0b, + 0x0f, 0x24, 0x1b, 0x1e, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x0b, 0x00, 0x4d, 0x30, 0x1e, 0x01, 0x1e, + 0x74, 0x17, 0x0f, 0x02, 0x72, 0x10, 0x4f, 0x01, 0x01, 0x01, 0x01, 0x0b, 0x17, 0x03, 0x0b, 0x08, + 0x08, 0x09, 0x72, 0x0a, 0x08, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0x33, + 0xed, 0x32, 0x10, 0xfd, 0x5d, 0x2b, 0xce, 0x01, 0x10, 0xd6, 0xd6, 0x5d, 0xd6, 0x32, 0xed, 0x32, + 0x10, 0xde, 0xc6, 0xc6, 0xc5, 0x31, 0x30, 0x13, 0x33, 0x15, 0x23, 0x14, 0x0e, 0x02, 0x07, 0x33, + 0x15, 0x21, 0x36, 0x36, 0x37, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, + 0x07, 0x26, 0x26, 0x27, 0x22, 0x0e, 0x02, 0x15, 0xea, 0x94, 0x94, 0x02, 0x03, 0x04, 0x03, 0xe9, + 0xfe, 0x90, 0x10, 0x0a, 0x02, 0x4d, 0x4d, 0x1d, 0x34, 0x4b, 0x2f, 0x23, 0x3f, 0x1e, 0x21, 0x15, + 0x24, 0x1a, 0x15, 0x24, 0x19, 0x0e, 0x01, 0x5b, 0x65, 0x10, 0x26, 0x27, 0x24, 0x0f, 0x66, 0x48, + 0x7b, 0x33, 0x65, 0x34, 0x43, 0x59, 0x36, 0x16, 0x0e, 0x0d, 0x62, 0x0b, 0x08, 0x01, 0x09, 0x19, + 0x2a, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x56, 0x01, 0xe2, 0x02, 0x16, 0x00, 0x1d, + 0x00, 0x29, 0x00, 0xdb, 0xb5, 0x25, 0x40, 0x0e, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, + 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc8, 0xb3, 0x0d, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, + 0x0c, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0x40, + 0x20, 0x0b, 0x0d, 0x00, 0x4c, 0x14, 0x40, 0x0c, 0x00, 0x4d, 0x09, 0x20, 0x0e, 0x00, 0x4d, 0x09, + 0x40, 0x0b, 0x0d, 0x00, 0x4c, 0x05, 0x20, 0x0e, 0x00, 0x4d, 0x05, 0x40, 0x0b, 0x0d, 0x00, 0x4c, + 0x04, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0c, 0x00, + 0x4d, 0x1c, 0x40, 0x0d, 0x00, 0x4d, 0x1c, 0x20, 0x0c, 0x00, 0x4d, 0x1c, 0x40, 0x0b, 0x00, 0x4d, + 0x12, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0d, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0b, + 0x0d, 0x00, 0x4c, 0x02, 0x40, 0x0d, 0x00, 0x4d, 0x02, 0x40, 0x0b, 0x00, 0x4d, 0x04, 0x0a, 0x50, + 0x1e, 0x01, 0x1e, 0x84, 0x10, 0x07, 0x01, 0x07, 0x24, 0x84, 0x17, 0x1a, 0x14, 0x17, 0x17, 0x2a, + 0x2b, 0x13, 0x0b, 0x27, 0x84, 0x0f, 0x2a, 0x21, 0x84, 0x00, 0x1b, 0xa7, 0x03, 0xa7, 0x00, 0x3f, + 0x3f, 0xde, 0xed, 0x10, 0xde, 0xed, 0xde, 0xc6, 0x01, 0x11, 0x12, 0x39, 0x2f, 0xde, 0xc0, 0x10, + 0xfd, 0xdc, 0x5d, 0xed, 0x5d, 0xde, 0xc0, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, + 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x37, 0x27, 0x37, 0x17, 0x36, 0x17, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xfb, 0x2c, 0x26, 0x42, 0x53, 0x40, 0x13, + 0x13, 0x40, 0x54, 0x42, 0x13, 0x27, 0x17, 0x17, 0x27, 0x14, 0x42, 0x53, 0x40, 0x13, 0x13, 0x40, + 0x54, 0x42, 0x24, 0x76, 0x2b, 0x1e, 0x1e, 0x2b, 0x2b, 0x1e, 0x1e, 0x2b, 0x01, 0xe6, 0x10, 0x3f, + 0x51, 0x3e, 0x24, 0x2c, 0x2c, 0x24, 0x3e, 0x52, 0x40, 0x09, 0x07, 0x07, 0x09, 0x3f, 0x51, 0x3e, + 0x22, 0x2e, 0x2e, 0x22, 0x3e, 0x52, 0x40, 0x10, 0xb0, 0x26, 0x28, 0x28, 0x26, 0x26, 0x28, 0x28, + 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x21, 0x00, 0x85, 0xb9, 0x00, + 0x0d, 0xff, 0xe0, 0x40, 0x45, 0x0d, 0x00, 0x4d, 0x16, 0x44, 0x17, 0x23, 0x09, 0x05, 0x1d, 0x1e, + 0x1e, 0x21, 0x21, 0x00, 0x03, 0x04, 0x14, 0x02, 0x01, 0x00, 0x05, 0x08, 0x04, 0x20, 0x1f, 0x01, + 0x00, 0x14, 0x00, 0x01, 0x1f, 0x20, 0x14, 0x04, 0x08, 0x05, 0x08, 0x22, 0x23, 0x11, 0x44, 0x10, + 0x22, 0x17, 0x02, 0x1c, 0x0b, 0x73, 0x08, 0x01, 0x04, 0x73, 0x20, 0x07, 0x1f, 0x14, 0x11, 0x08, + 0x08, 0x03, 0x11, 0x02, 0x10, 0x02, 0x03, 0x08, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, + 0x39, 0x2f, 0x12, 0x39, 0x33, 0xde, 0x32, 0xed, 0x32, 0x10, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xd6, + 0xed, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, + 0x12, 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x10, 0xd6, 0xed, + 0x31, 0x30, 0x2b, 0x25, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x2e, + 0x03, 0x27, 0x33, 0x16, 0x16, 0x17, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x15, + 0x33, 0x01, 0xc0, 0x87, 0x7c, 0x88, 0x88, 0x88, 0x65, 0x13, 0x29, 0x26, 0x21, 0x0a, 0x84, 0x15, + 0x33, 0x24, 0x47, 0x25, 0x7f, 0x0b, 0x1e, 0x23, 0x27, 0x13, 0x5e, 0x87, 0x87, 0x68, 0x68, 0x68, + 0x54, 0x3e, 0x54, 0x22, 0x4b, 0x4b, 0x47, 0x1e, 0x40, 0x82, 0x48, 0x8e, 0x7c, 0x1d, 0x47, 0x4c, + 0x4b, 0x22, 0x54, 0x3e, 0x00, 0x02, 0x00, 0xbd, 0xff, 0x5b, 0x01, 0x39, 0x02, 0xbb, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x24, 0x40, 0x11, 0x01, 0x09, 0x02, 0x05, 0x6e, 0x03, 0x04, 0x00, 0x08, 0x07, + 0x05, 0x10, 0x03, 0x12, 0x00, 0x02, 0x12, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xc6, + 0xd6, 0x32, 0xfd, 0x32, 0xd6, 0xc6, 0x31, 0x30, 0x37, 0x33, 0x11, 0x23, 0x11, 0x33, 0x11, 0x23, + 0xbd, 0x7c, 0x7c, 0x7c, 0x7c, 0xbd, 0xfe, 0x9e, 0x03, 0x60, 0xfe, 0x9e, 0x00, 0x02, 0x00, 0x31, + 0xff, 0x9e, 0x01, 0xc1, 0x02, 0x7a, 0x00, 0x34, 0x00, 0x44, 0x00, 0x84, 0xb5, 0x27, 0x40, 0x0b, + 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0x40, 0x0a, 0x0b, 0x00, 0x4d, 0x3d, 0x40, 0x13, 0x14, 0x00, + 0x4c, 0x35, 0xb8, 0xff, 0xc0, 0x40, 0x3e, 0x13, 0x14, 0x00, 0x4c, 0x08, 0x46, 0x2e, 0x46, 0x35, + 0x3d, 0x10, 0x2f, 0x40, 0x3f, 0x40, 0x02, 0x40, 0x64, 0x00, 0x28, 0x01, 0x28, 0x1c, 0x46, 0x23, + 0x46, 0x16, 0x38, 0x64, 0x00, 0x10, 0x10, 0x10, 0x30, 0x10, 0x03, 0x10, 0x30, 0x34, 0x01, 0x34, + 0x45, 0x26, 0x35, 0x3d, 0x0b, 0x0b, 0x3d, 0x35, 0x26, 0x04, 0x20, 0x00, 0x05, 0x67, 0x31, 0x10, + 0x1d, 0x20, 0x67, 0x19, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x12, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x10, 0xce, 0xd6, 0x5d, + 0xed, 0x5d, 0x12, 0x39, 0x39, 0x10, 0xde, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, + 0x37, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x13, 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x36, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x52, + 0x14, 0x24, 0x24, 0x28, 0x18, 0x21, 0x23, 0x25, 0x2d, 0x23, 0x3d, 0x2e, 0x1b, 0x20, 0x26, 0x13, + 0x17, 0x64, 0x5e, 0x28, 0x56, 0x23, 0x21, 0x1c, 0x3d, 0x28, 0x29, 0x16, 0x1d, 0x2a, 0xa5, 0x1f, + 0x20, 0x19, 0x19, 0x64, 0x5b, 0x45, 0x60, 0x1f, 0x9c, 0x12, 0x17, 0x09, 0x1d, 0x35, 0x2d, 0x12, + 0x16, 0x0a, 0x1e, 0x35, 0x28, 0x08, 0x0c, 0x09, 0x04, 0x17, 0x13, 0x10, 0x19, 0x0e, 0x0c, 0x1b, + 0x26, 0x32, 0x23, 0x24, 0x40, 0x24, 0x11, 0x2c, 0x19, 0x45, 0x4d, 0x13, 0x0e, 0x62, 0x0b, 0x0f, + 0x18, 0x0f, 0x12, 0x18, 0x0c, 0x30, 0x71, 0x26, 0x38, 0x1e, 0x17, 0x2d, 0x23, 0x4b, 0x47, 0x18, + 0x10, 0x01, 0x9d, 0x0e, 0x29, 0x0f, 0x11, 0x1a, 0x16, 0x17, 0x0e, 0x0f, 0x28, 0x0f, 0x12, 0x19, + 0x15, 0x17, 0x00, 0x00, 0x00, 0x02, 0x00, 0x53, 0x02, 0x1a, 0x01, 0xa4, 0x02, 0xa1, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x20, 0x40, 0x10, 0x15, 0x0f, 0x09, 0x20, 0x03, 0x30, 0x03, 0x02, 0x03, 0x18, + 0x0c, 0x12, 0x9f, 0x00, 0x06, 0x9f, 0x00, 0x3f, 0xcd, 0x3f, 0xcd, 0x01, 0x10, 0xd6, 0x5d, 0xdd, + 0xde, 0xcd, 0x31, 0x30, 0x13, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x33, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x98, 0x1c, 0x29, 0x29, + 0x1c, 0x1b, 0x2a, 0x2a, 0xac, 0x1c, 0x29, 0x29, 0x1c, 0x1c, 0x29, 0x29, 0x02, 0x1a, 0x23, 0x20, + 0x20, 0x24, 0x24, 0x20, 0x20, 0x23, 0x23, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, 0x23, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xdd, 0x01, 0xdb, 0x00, 0x1d, 0x00, 0x31, 0x00, 0x45, + 0x00, 0x89, 0xb9, 0x00, 0x44, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x43, 0xb8, 0xff, 0xe0, 0xb3, + 0x0d, 0x00, 0x4d, 0x3f, 0xb8, 0xff, 0xe0, 0x40, 0x47, 0x0c, 0x0d, 0x00, 0x4c, 0x3a, 0x20, 0x0c, + 0x00, 0x4d, 0x4f, 0x39, 0x01, 0x34, 0x20, 0x0c, 0x00, 0x4d, 0x10, 0x00, 0x1d, 0x11, 0x1d, 0x11, + 0x1d, 0x17, 0x37, 0x7f, 0x3f, 0x28, 0x5f, 0x28, 0x7f, 0x28, 0x03, 0x28, 0x47, 0x17, 0x7f, 0x40, + 0x08, 0x01, 0x08, 0x41, 0x7f, 0x1e, 0x46, 0x14, 0x80, 0x0d, 0x1a, 0x80, 0x03, 0x4f, 0x0d, 0x01, + 0x30, 0x03, 0x01, 0x0d, 0x03, 0x0d, 0x03, 0x3c, 0x32, 0x80, 0x2d, 0x07, 0x3c, 0x80, 0x23, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x5d, 0x10, 0xed, 0x10, 0xed, + 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x11, 0x39, 0x39, 0x2f, 0x2f, + 0x11, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x06, 0x06, 0x23, 0x22, + 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x25, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x17, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x47, 0x11, 0x25, 0x11, 0x1d, 0x2b, 0x1c, 0x0e, + 0x0e, 0x1c, 0x2b, 0x1e, 0x10, 0x23, 0x11, 0x14, 0x0b, 0x16, 0x09, 0x20, 0x1b, 0x21, 0x1e, 0x09, + 0x17, 0x0b, 0xfe, 0xe3, 0x26, 0x3f, 0x51, 0x2c, 0x2b, 0x52, 0x3f, 0x26, 0x26, 0x3f, 0x52, 0x2b, + 0x2c, 0x51, 0x3f, 0x26, 0xe1, 0x1e, 0x38, 0x2d, 0x1b, 0x1b, 0x2c, 0x39, 0x1e, 0x1e, 0x38, 0x2d, + 0x1b, 0x1b, 0x2d, 0x38, 0x78, 0x08, 0x08, 0x15, 0x23, 0x2d, 0x18, 0x18, 0x2e, 0x24, 0x16, 0x05, + 0x08, 0x36, 0x05, 0x03, 0x28, 0x19, 0x20, 0x25, 0x04, 0x05, 0x3a, 0x3d, 0x5c, 0x3d, 0x1e, 0x1e, + 0x3d, 0x5c, 0x3d, 0x3d, 0x5b, 0x3d, 0x1f, 0x1f, 0x3d, 0x5b, 0x77, 0x17, 0x2e, 0x44, 0x2c, 0x2b, + 0x43, 0x2e, 0x18, 0x18, 0x2e, 0x43, 0x2b, 0x2c, 0x44, 0x2e, 0x17, 0x00, 0x00, 0x02, 0x00, 0x68, + 0x01, 0x13, 0x01, 0x95, 0x02, 0x78, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x6c, 0x40, 0x0b, 0x29, 0x40, + 0x0e, 0x00, 0x4d, 0x0a, 0x40, 0x0e, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, + 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x2a, 0x0d, 0x00, + 0x4d, 0x04, 0x21, 0x85, 0x60, 0x12, 0x01, 0x12, 0x2d, 0x29, 0x0a, 0x84, 0x30, 0x19, 0x60, 0x19, + 0x70, 0x19, 0x03, 0x19, 0x2c, 0x9f, 0x1e, 0x01, 0x1e, 0x81, 0x07, 0x07, 0x0d, 0x00, 0x7d, 0xb0, + 0x16, 0x01, 0x16, 0x28, 0x25, 0x7d, 0x0d, 0x03, 0x00, 0x3f, 0xfd, 0xc2, 0x2f, 0x5d, 0xed, 0x11, + 0x39, 0x10, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xc4, 0x10, 0xde, 0x5d, 0xed, 0x32, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, + 0x22, 0x06, 0x15, 0x14, 0x16, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x06, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, + 0x36, 0x36, 0x01, 0x06, 0x0e, 0x1a, 0x08, 0x06, 0x17, 0x0a, 0x1b, 0x28, 0x20, 0x12, 0x2b, 0x3a, + 0x23, 0x0f, 0x14, 0x4e, 0x34, 0x46, 0x51, 0x18, 0x29, 0x36, 0x1e, 0x12, 0x1c, 0x0b, 0x1e, 0x25, + 0x19, 0x32, 0x12, 0x0d, 0x11, 0x43, 0x01, 0x5f, 0x02, 0x01, 0x45, 0x02, 0x03, 0x0f, 0x17, 0x17, + 0x10, 0x01, 0x19, 0x13, 0x23, 0x33, 0x1f, 0xcb, 0x05, 0x0d, 0x33, 0x3e, 0x1e, 0x29, 0x18, 0x0b, + 0x04, 0x02, 0x09, 0x19, 0x1c, 0x07, 0x06, 0x4f, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, + 0x00, 0x2e, 0x01, 0xc3, 0x01, 0xce, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x5b, 0x40, 0x18, 0x03, 0x04, + 0x05, 0x09, 0x0a, 0x0b, 0x07, 0x06, 0x5f, 0x08, 0x01, 0x08, 0x79, 0x0b, 0x52, 0x5f, 0x02, 0x01, + 0x02, 0x79, 0x05, 0x01, 0x00, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x10, 0x48, 0x05, 0x0c, + 0x0a, 0x08, 0x08, 0x0a, 0x06, 0x0d, 0x04, 0x02, 0x02, 0x04, 0x0c, 0x06, 0x0a, 0x00, 0x0a, 0x00, + 0x3f, 0x3f, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, + 0x2f, 0x01, 0x10, 0xde, 0x2b, 0xd1, 0xc9, 0x10, 0xfd, 0x5d, 0xfe, 0xed, 0x5d, 0xd9, 0xc9, 0x10, + 0xd9, 0xc9, 0x10, 0xd1, 0xc9, 0x31, 0x30, 0x13, 0x17, 0x07, 0x17, 0x07, 0x27, 0x25, 0x17, 0x07, + 0x17, 0x07, 0x27, 0xba, 0x41, 0x5e, 0x5e, 0x3f, 0x8a, 0x01, 0x4f, 0x42, 0x5d, 0x5d, 0x40, 0x88, + 0x01, 0xce, 0x28, 0xa7, 0xa7, 0x2a, 0xd1, 0xcf, 0x28, 0xa7, 0xa7, 0x2a, 0xd1, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x2a, 0x01, 0xc0, 0x01, 0x6b, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, + 0x05, 0x79, 0x02, 0x03, 0x06, 0x00, 0x02, 0x72, 0x04, 0x83, 0x00, 0x3f, 0xfd, 0xc5, 0x01, 0x10, + 0xd6, 0xdd, 0xed, 0x31, 0x30, 0x25, 0x23, 0x35, 0x21, 0x35, 0x21, 0x01, 0xc0, 0x69, 0xfe, 0xd6, + 0x01, 0x93, 0x2a, 0xdb, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0x00, 0xc4, 0x01, 0x83, + 0x01, 0x3d, 0x02, 0x06, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xdd, + 0x01, 0xdb, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x31, 0x00, 0x45, 0x00, 0xf8, 0xb9, 0x00, 0x44, 0xff, + 0xe0, 0xb6, 0x0c, 0x00, 0x4d, 0x44, 0x43, 0x01, 0x3f, 0xb8, 0xff, 0xe0, 0x40, 0x21, 0x0c, 0x0d, + 0x00, 0x4c, 0x3a, 0x40, 0x0d, 0x00, 0x4d, 0x3a, 0x20, 0x0c, 0x00, 0x4d, 0x34, 0x20, 0x0c, 0x00, + 0x4d, 0x4b, 0x34, 0x01, 0x1a, 0x60, 0x1a, 0x00, 0x4d, 0x17, 0x40, 0x1b, 0x00, 0x4d, 0x0e, 0xb8, + 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x74, 0x1a, 0x00, 0x4d, 0x1b, + 0x40, 0x1a, 0x00, 0x4d, 0x17, 0x40, 0x1b, 0x00, 0x4d, 0x06, 0x40, 0x0a, 0x00, 0x4d, 0x12, 0x12, + 0x0f, 0x0f, 0x82, 0x0e, 0x0b, 0x0b, 0x0e, 0x17, 0x40, 0x19, 0x00, 0x4d, 0x17, 0x7f, 0x5f, 0x09, + 0x01, 0x09, 0x40, 0x19, 0x1c, 0x48, 0xfb, 0x09, 0x01, 0xe4, 0x09, 0x01, 0x3f, 0x09, 0x4f, 0x09, + 0x02, 0x09, 0x37, 0x7f, 0x1f, 0x28, 0x3f, 0x28, 0x5f, 0x28, 0x7f, 0x28, 0x04, 0x28, 0x47, 0x1d, + 0x13, 0x13, 0x01, 0x01, 0x10, 0x00, 0x01, 0x00, 0x82, 0x03, 0x40, 0x10, 0x13, 0x48, 0x03, 0x41, + 0x7f, 0x1e, 0x46, 0x0f, 0x01, 0x00, 0x80, 0x14, 0x01, 0x14, 0x01, 0x14, 0x3c, 0x32, 0x80, 0x2d, + 0x07, 0x1a, 0x80, 0x1f, 0x06, 0x2f, 0x06, 0x3f, 0x06, 0x03, 0x06, 0x81, 0x3c, 0x80, 0x23, 0x0b, + 0x00, 0x3f, 0xfd, 0xfe, 0x71, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x11, + 0x33, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0x2b, 0xed, 0x71, 0x32, 0x2f, 0x32, 0x11, 0x33, 0x10, 0xde, + 0x5d, 0xfd, 0xde, 0x5d, 0x5d, 0x5d, 0x2b, 0x71, 0xed, 0x2b, 0xc2, 0x32, 0x2f, 0x10, 0xe9, 0x2f, + 0x32, 0x2f, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, + 0x2b, 0x2b, 0x5d, 0x2b, 0x37, 0x15, 0x23, 0x35, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, + 0x16, 0x16, 0x17, 0x23, 0x26, 0x26, 0x27, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x07, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x2e, 0x02, 0x17, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0xdc, 0x36, 0x0e, 0x22, 0x13, 0x39, 0x37, 0x28, 0x0c, 0x1a, 0x0d, 0x39, 0x0d, 0x14, + 0x0a, 0x24, 0x12, 0x1b, 0x1a, 0x20, 0x11, 0x06, 0x0b, 0x05, 0xc3, 0x26, 0x3f, 0x51, 0x2c, 0x2b, + 0x52, 0x3f, 0x26, 0x26, 0x3f, 0x52, 0x2b, 0x2c, 0x51, 0x3f, 0x26, 0xe1, 0x1e, 0x38, 0x2d, 0x1b, + 0x1b, 0x2c, 0x39, 0x1e, 0x1e, 0x38, 0x2d, 0x1b, 0x1b, 0x2d, 0x38, 0xbb, 0x4d, 0xee, 0x04, 0x05, + 0x2c, 0x2a, 0x30, 0x17, 0x11, 0x2f, 0x1a, 0x18, 0x25, 0x10, 0x32, 0x0e, 0x17, 0x14, 0x0d, 0x01, + 0x01, 0x4a, 0x3d, 0x5c, 0x3d, 0x1e, 0x1e, 0x3d, 0x5c, 0x3d, 0x3d, 0x5b, 0x3d, 0x1f, 0x1f, 0x3d, + 0x5b, 0x77, 0x17, 0x2e, 0x44, 0x2c, 0x2b, 0x43, 0x2e, 0x18, 0x18, 0x2e, 0x43, 0x2b, 0x2c, 0x44, + 0x2e, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x02, 0x30, 0x01, 0x8c, 0x02, 0x87, 0x00, 0x03, + 0x00, 0x11, 0xb6, 0x02, 0x00, 0x04, 0x03, 0x73, 0x01, 0x93, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd6, + 0xcd, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x6c, 0x01, 0x20, 0xfe, 0xe0, 0x02, 0x87, 0x57, 0x00, + 0x00, 0x02, 0x00, 0x6c, 0x01, 0xa5, 0x01, 0x8c, 0x02, 0xba, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x1f, + 0x40, 0x0f, 0x1d, 0x05, 0x7c, 0x13, 0x19, 0x7c, 0x0d, 0x1c, 0x0a, 0x7d, 0x10, 0x16, 0x7d, 0x00, + 0x10, 0x00, 0x3f, 0xfd, 0xde, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xde, 0xfd, 0xc6, 0x31, 0x30, 0x13, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0xfc, 0x1f, 0x35, 0x26, 0x16, 0x16, 0x26, + 0x35, 0x1f, 0x42, 0x4e, 0x50, 0x40, 0x17, 0x1f, 0x1f, 0x17, 0x17, 0x20, 0x20, 0x02, 0xba, 0x13, + 0x24, 0x34, 0x20, 0x20, 0x33, 0x24, 0x13, 0x49, 0x41, 0x41, 0x4a, 0xc1, 0x1b, 0x1c, 0x1c, 0x1a, + 0x1a, 0x1c, 0x1c, 0x1b, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x2e, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x7d, 0xb9, 0x00, 0x01, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x00, 0xb8, 0xff, + 0xc0, 0x40, 0x20, 0x0d, 0x00, 0x4d, 0x02, 0x70, 0x0a, 0x80, 0x0a, 0x02, 0x0a, 0x08, 0xe0, 0x0b, + 0x01, 0x0b, 0x52, 0x0e, 0x70, 0x05, 0x80, 0x05, 0x02, 0x05, 0x04, 0x70, 0x00, 0x01, 0x00, 0x10, + 0x03, 0x08, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x26, 0x0a, 0x00, 0x4d, 0x70, 0x07, 0x80, 0x07, 0x02, + 0x07, 0x05, 0x08, 0x55, 0x0e, 0x70, 0x0b, 0x80, 0x0b, 0x02, 0x0b, 0x0c, 0x40, 0x09, 0x0a, 0x00, + 0x4c, 0x40, 0x0c, 0x01, 0x2f, 0x0c, 0x3f, 0x0c, 0x02, 0x0c, 0x01, 0x55, 0x02, 0x08, 0x00, 0x3f, + 0xfd, 0xd6, 0x5d, 0x5d, 0x2b, 0xdd, 0x5d, 0x32, 0xfd, 0x32, 0xcd, 0x5d, 0x2b, 0x3f, 0x01, 0x10, + 0xd6, 0x5d, 0xd0, 0xdd, 0x5d, 0x32, 0xfd, 0x5d, 0x32, 0xdd, 0x5d, 0xc0, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x37, 0x21, 0x15, 0x21, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, + 0x23, 0x28, 0x01, 0xa4, 0xfe, 0x5c, 0x9d, 0x6a, 0x9d, 0x9d, 0x6a, 0x9d, 0x66, 0x66, 0x01, 0x92, + 0x9c, 0x9c, 0x66, 0x9d, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x71, 0x01, 0x0e, 0x01, 0x82, + 0x02, 0x79, 0x00, 0x1c, 0x00, 0x37, 0x40, 0x1d, 0x10, 0x84, 0x00, 0x07, 0x1e, 0x17, 0x06, 0x84, + 0x0a, 0x1d, 0x06, 0x07, 0x7c, 0x0d, 0x03, 0xb0, 0x08, 0xc0, 0x08, 0x02, 0x08, 0x08, 0x1a, 0x1e, + 0x16, 0x13, 0x7d, 0x1a, 0x74, 0x00, 0x3f, 0xfd, 0xce, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0x39, 0x39, + 0xed, 0x32, 0x01, 0x10, 0xd6, 0xed, 0xc6, 0x10, 0xde, 0xd6, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x33, 0x15, 0x21, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x01, 0x79, 0x2e, 0x1b, 0x10, 0x1f, + 0x0b, 0x8c, 0xfe, 0xff, 0x2f, 0x2d, 0x19, 0x1d, 0x10, 0x0f, 0x1a, 0x2c, 0x0f, 0x2e, 0x17, 0x48, + 0x28, 0x46, 0x3b, 0x02, 0x0b, 0x27, 0x35, 0x17, 0x0d, 0x1e, 0x0e, 0x51, 0x19, 0x2c, 0x46, 0x26, + 0x15, 0x1e, 0x10, 0x0e, 0x10, 0x14, 0x0d, 0x45, 0x14, 0x21, 0x3d, 0x00, 0x00, 0x01, 0x00, 0x71, + 0x01, 0x07, 0x01, 0x80, 0x02, 0x79, 0x00, 0x2a, 0x00, 0xdf, 0x40, 0x0b, 0x22, 0x40, 0x0c, 0x00, + 0x4d, 0x21, 0x40, 0x0b, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xc0, 0xb3, 0x13, 0x00, 0x4d, 0x1f, 0xb8, + 0xff, 0xc0, 0xb3, 0x15, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x13, 0x00, 0x4d, 0x03, + 0x40, 0x0c, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, + 0xb3, 0x13, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, + 0xb3, 0x0d, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, + 0x40, 0x4f, 0x09, 0x0b, 0x00, 0x4c, 0x10, 0x40, 0x11, 0x12, 0x00, 0x4c, 0x10, 0x40, 0x0f, 0x00, + 0x4d, 0x10, 0x20, 0x0d, 0x0e, 0x00, 0x4c, 0x10, 0x40, 0x09, 0x0c, 0x00, 0x4c, 0x0f, 0x20, 0x0e, + 0x00, 0x4d, 0xaf, 0x06, 0x01, 0x05, 0x40, 0x13, 0x00, 0x4d, 0x0b, 0x84, 0x3f, 0x19, 0x01, 0x19, + 0x19, 0x1f, 0x07, 0x06, 0x03, 0x03, 0x84, 0x1f, 0x2c, 0x11, 0x27, 0x2b, 0x28, 0x24, 0x7d, 0x00, + 0x05, 0x7d, 0x08, 0x00, 0x08, 0x1c, 0x08, 0x1c, 0x00, 0x03, 0x2c, 0x14, 0x10, 0x0d, 0x7d, 0x14, + 0x74, 0x00, 0x3f, 0xfd, 0xce, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x10, 0xed, + 0x10, 0xed, 0xce, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xda, 0xe9, 0x2f, 0xce, 0x32, 0x10, 0xc0, 0x2f, + 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0xe7, 0x20, 0x19, 0x3f, 0x25, 0x25, 0x15, 0x1a, 0x27, 0x15, 0x28, 0x13, 0x22, 0x16, + 0x43, 0x20, 0x24, 0x31, 0x1e, 0x0c, 0x11, 0x14, 0x1d, 0x19, 0x10, 0x24, 0x3a, 0x2a, 0x1e, 0x45, + 0x14, 0x15, 0x1e, 0x2a, 0x01, 0x5a, 0x14, 0x0e, 0x24, 0x49, 0x10, 0x11, 0x1c, 0x0e, 0x08, 0x46, + 0x0e, 0x15, 0x10, 0x1b, 0x25, 0x14, 0x13, 0x21, 0x11, 0x0d, 0x2d, 0x1b, 0x19, 0x2a, 0x1f, 0x12, + 0x0d, 0x0b, 0x4f, 0x0d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x98, 0x02, 0x01, 0x01, 0x73, + 0x02, 0xb3, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x01, 0x03, 0x7d, 0x00, 0x3f, 0xcd, + 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x73, 0xae, 0x2d, 0x9e, 0x02, + 0x55, 0x54, 0x43, 0x6f, 0x00, 0x01, 0x00, 0x3b, 0xff, 0x5b, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x18, + 0x00, 0x37, 0x40, 0x0e, 0x0a, 0x51, 0xa0, 0x0b, 0xb0, 0x0b, 0x02, 0x0b, 0x1a, 0x16, 0x00, 0x51, + 0x17, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0c, 0x48, 0x18, 0x19, 0x18, 0x0a, 0x16, 0x0e, + 0x06, 0x57, 0x0f, 0x07, 0x0b, 0x0a, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, + 0x32, 0xed, 0x32, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x37, 0x11, 0x33, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x16, 0x16, 0x15, 0x15, 0x23, + 0x11, 0xb6, 0x0a, 0x13, 0x1d, 0x13, 0x0e, 0x1d, 0x0c, 0x7c, 0x20, 0x5e, 0x33, 0x10, 0x30, 0x15, + 0x02, 0x04, 0x7b, 0x01, 0xd6, 0xff, 0x00, 0x23, 0x2d, 0x1b, 0x0b, 0x03, 0x02, 0x01, 0x71, 0xfe, + 0x3a, 0x09, 0x12, 0x09, 0x06, 0x15, 0x27, 0x1a, 0x53, 0x02, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x13, + 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x72, 0x00, 0x13, 0x00, 0x3e, 0x40, 0x29, 0x20, 0x0c, 0x30, 0x0c, + 0xc0, 0x0c, 0xd0, 0x0c, 0xe0, 0x0c, 0x05, 0x0c, 0x52, 0x0d, 0x20, 0x12, 0x30, 0x12, 0xc0, 0x12, + 0xd0, 0x12, 0xe0, 0x12, 0x05, 0x12, 0x52, 0x13, 0x03, 0x14, 0x00, 0x00, 0x08, 0x12, 0x12, 0x0d, + 0x12, 0x11, 0x72, 0x08, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x01, 0x10, 0xd6, + 0xd4, 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x26, 0x26, 0x07, 0x11, 0x23, 0xac, 0x4c, 0x4d, 0x23, 0x41, + 0x5c, 0x39, 0x30, 0x65, 0x26, 0x65, 0x0a, 0x30, 0x16, 0x66, 0xe8, 0x11, 0x5b, 0x57, 0x30, 0x4a, + 0x33, 0x1a, 0x0b, 0x0a, 0xfc, 0xfe, 0x02, 0xaf, 0x02, 0x02, 0x02, 0xfd, 0x4f, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xa1, 0x00, 0xaf, 0x01, 0x54, 0x01, 0x61, 0x02, 0x07, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xba, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9f, 0xff, 0x56, 0x01, 0x67, 0x00, 0x12, 0x00, 0x19, + 0x00, 0x18, 0x40, 0x0a, 0x03, 0x10, 0x0a, 0x1a, 0x16, 0x06, 0x0b, 0x0e, 0x08, 0x12, 0x00, 0x3f, + 0xd5, 0xc6, 0x3f, 0x01, 0x10, 0xd6, 0xdc, 0xc5, 0x31, 0x30, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, + 0x33, 0x06, 0x06, 0x01, 0x2c, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, + 0x10, 0x29, 0x24, 0x14, 0x05, 0x11, 0x05, 0x50, 0x05, 0x0a, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, + 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x11, 0x24, 0x08, 0x0b, 0x14, 0x00, + 0x00, 0x01, 0x00, 0x81, 0x01, 0x0e, 0x01, 0xa6, 0x02, 0x72, 0x00, 0x0e, 0x00, 0x3b, 0x40, 0x21, + 0x0e, 0x40, 0x12, 0x00, 0x4d, 0x0d, 0x40, 0x10, 0x12, 0x00, 0x4c, 0x0d, 0x0e, 0x0c, 0x79, 0x02, + 0x79, 0x07, 0x00, 0x0f, 0x0e, 0x00, 0x73, 0x01, 0x03, 0x0b, 0x01, 0x02, 0x0d, 0x0d, 0x10, 0x0b, + 0x04, 0x00, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x12, 0x39, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xc6, 0xfd, 0xfd, 0xc5, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x35, 0x33, 0x35, 0x06, 0x06, 0x07, + 0x27, 0x36, 0x36, 0x37, 0x33, 0x11, 0x33, 0x15, 0x8a, 0x64, 0x12, 0x25, 0x1b, 0x1b, 0x26, 0x46, + 0x1a, 0x4d, 0x52, 0x01, 0x0e, 0x51, 0xa0, 0x0b, 0x0f, 0x0b, 0x4e, 0x0f, 0x26, 0x15, 0xfe, 0xed, + 0x51, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4a, 0x01, 0x11, 0x01, 0xa7, 0x02, 0x79, 0x00, 0x13, + 0x00, 0x1f, 0x00, 0x64, 0xb9, 0x00, 0x0d, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0c, 0xb8, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0a, 0xb8, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x08, 0xb8, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x0e, 0x00, 0x4d, 0x5f, 0x00, + 0x01, 0x00, 0x84, 0x14, 0x1a, 0x84, 0x40, 0x0a, 0x01, 0x0a, 0x20, 0x05, 0x74, 0x1d, 0x17, 0x74, + 0x0f, 0x9e, 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xd6, 0xed, 0x5d, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x01, 0xa7, 0x19, 0x2e, 0x40, 0x27, 0x27, 0x40, 0x2e, 0x1a, 0x1a, 0x2e, + 0x40, 0x27, 0x27, 0x40, 0x2e, 0x19, 0x66, 0x25, 0x23, 0x22, 0x27, 0x26, 0x23, 0x23, 0x25, 0x01, + 0xc4, 0x2a, 0x42, 0x2e, 0x19, 0x19, 0x2e, 0x42, 0x2a, 0x2a, 0x44, 0x2e, 0x19, 0x19, 0x2e, 0x44, + 0x2a, 0x2b, 0x31, 0x31, 0x2b, 0x29, 0x30, 0x30, 0x00, 0x02, 0x00, 0x32, 0x00, 0x2e, 0x01, 0xc3, + 0x01, 0xce, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x38, 0x40, 0x1c, 0x05, 0x0b, 0x08, 0x08, 0x06, 0x0a, + 0x03, 0x09, 0x03, 0x04, 0x00, 0x01, 0x09, 0x03, 0x01, 0x01, 0x03, 0x09, 0x03, 0x0d, 0x07, 0x0c, + 0x06, 0x0a, 0x0a, 0x00, 0x04, 0x0a, 0x00, 0x3f, 0xc4, 0x3f, 0xc4, 0x01, 0x10, 0xc6, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0x11, 0x12, 0x17, 0x39, 0x10, 0xd5, 0xc4, 0x31, 0x30, + 0x25, 0x27, 0x37, 0x27, 0x37, 0x17, 0x05, 0x27, 0x37, 0x27, 0x37, 0x17, 0x01, 0x3b, 0x41, 0x5e, + 0x5e, 0x3f, 0x8a, 0xfe, 0xb1, 0x42, 0x5d, 0x5d, 0x40, 0x88, 0x2e, 0x28, 0xa8, 0xa7, 0x29, 0xd0, + 0xd0, 0x28, 0xa8, 0xa7, 0x29, 0xd0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x01, 0xef, + 0x02, 0x72, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x20, 0x00, 0xd3, 0xb9, 0x00, 0x1a, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x0a, 0xb8, 0xff, + 0xe0, 0xb3, 0x0f, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x09, 0xb8, 0xff, + 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xe0, 0xb4, 0x0e, 0x0f, 0x00, 0x4c, 0x17, 0xb8, + 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x14, 0xb8, + 0xff, 0xc0, 0x40, 0x4c, 0x0d, 0x00, 0x4d, 0x00, 0x40, 0x0c, 0x0d, 0x00, 0x4c, 0x1e, 0x20, 0x1f, + 0x20, 0xaf, 0x1d, 0x1e, 0x14, 0x1d, 0x1e, 0x1d, 0x22, 0x07, 0x1c, 0x8f, 0x04, 0x40, 0x01, 0x01, + 0x01, 0x02, 0x22, 0x1f, 0x21, 0x90, 0x12, 0x01, 0x12, 0x8f, 0x13, 0x0d, 0x21, 0x17, 0x14, 0x21, + 0x0d, 0x14, 0x0d, 0x14, 0x10, 0x21, 0x20, 0x04, 0x1f, 0x0c, 0x1e, 0x0c, 0x1d, 0x04, 0x12, 0x8c, + 0x10, 0x04, 0x18, 0x1c, 0x07, 0x02, 0x03, 0x03, 0x07, 0x06, 0x8e, 0x0c, 0x00, 0x8d, 0x05, 0x8e, + 0x00, 0x3f, 0xed, 0x32, 0x3f, 0xc5, 0x32, 0x10, 0xc5, 0x10, 0xd5, 0xc6, 0x3f, 0xed, 0x3f, 0x3f, + 0x3f, 0x3f, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x01, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xc6, 0x10, 0xd6, 0xd5, 0x5d, 0x32, 0xed, 0x32, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, + 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, + 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x01, 0x36, 0x36, 0x37, + 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x06, 0x06, 0x07, 0x33, 0x13, 0x01, 0x23, 0x01, + 0x01, 0xcb, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, 0x20, 0xfe, 0x9f, 0x22, 0x32, 0x18, 0x3f, 0x55, + 0x14, 0x1c, 0x13, 0x01, 0x66, 0x10, 0x19, 0x0a, 0x33, 0x45, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xfa, + 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, 0x01, 0x33, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, + 0x0c, 0x05, 0xfe, 0xc8, 0x17, 0x29, 0x14, 0x02, 0x05, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x72, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x2c, + 0x00, 0x6f, 0x40, 0x41, 0x09, 0x40, 0x14, 0x00, 0x4d, 0x08, 0x20, 0x14, 0x00, 0x4d, 0x2a, 0x29, + 0x2c, 0x2b, 0x2a, 0x2b, 0x2c, 0xaf, 0x29, 0x2a, 0x14, 0x29, 0x2a, 0x29, 0x2e, 0x0c, 0x7c, 0x18, + 0x00, 0x2e, 0x2b, 0x2d, 0x90, 0x23, 0x01, 0x23, 0x8f, 0x24, 0x1e, 0x2d, 0x1e, 0x25, 0x28, 0x03, + 0x2d, 0x22, 0x2c, 0x04, 0x2b, 0x0c, 0x29, 0x04, 0x23, 0x8c, 0x22, 0x04, 0x11, 0x0e, 0x99, 0x15, + 0x9a, 0x1d, 0x81, 0x02, 0x0c, 0x00, 0x3f, 0xed, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, + 0x11, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xd4, 0xed, 0x5d, 0x10, 0xc2, 0x10, 0xd6, 0xd6, 0xed, + 0x10, 0xd0, 0x87, 0x2b, 0x10, 0x00, 0xc1, 0x87, 0x05, 0x7d, 0x10, 0xc4, 0x31, 0x30, 0x01, 0x2b, + 0x2b, 0x25, 0x15, 0x23, 0x26, 0x34, 0x35, 0x34, 0x36, 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x36, + 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0xeb, 0xd1, + 0x02, 0x29, 0x1d, 0x16, 0x11, 0x0c, 0x1a, 0x0f, 0x1e, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, + 0x16, 0x20, 0x24, 0x0e, 0xfe, 0x84, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0xab, + 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3f, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0e, 0x0b, 0x0e, + 0x0d, 0x16, 0x10, 0x0d, 0x35, 0x17, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0x01, 0xee, + 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0x79, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xef, 0x02, 0x79, 0x00, 0x28, 0x00, 0x35, 0x00, 0x3a, + 0x00, 0x3e, 0x00, 0x92, 0x40, 0x55, 0x2b, 0x20, 0x0f, 0x00, 0x4d, 0x28, 0x40, 0x17, 0x00, 0x4d, + 0x15, 0x40, 0x17, 0x00, 0x4d, 0x3c, 0x3e, 0x3d, 0x3e, 0xaf, 0x3b, 0x3c, 0x14, 0x3b, 0x3c, 0x3b, + 0x40, 0x1b, 0x20, 0x7c, 0x06, 0x0e, 0x1e, 0x06, 0x14, 0x09, 0x06, 0x06, 0x09, 0x14, 0x03, 0x40, + 0x3d, 0x3f, 0x28, 0x15, 0x3f, 0x08, 0x80, 0x0b, 0x25, 0x80, 0x03, 0x0b, 0x03, 0x1e, 0x03, 0x1e, + 0x0b, 0x03, 0x18, 0x3f, 0x3e, 0x04, 0x3d, 0x0c, 0x3c, 0x0c, 0x3b, 0x04, 0x36, 0x3a, 0x2c, 0x30, + 0x2f, 0x0c, 0x35, 0x29, 0x8d, 0x2e, 0x0c, 0x11, 0x80, 0x18, 0x05, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x32, 0x3f, 0xd5, 0x32, 0xd5, 0xc6, 0x3f, 0x3f, 0x3f, 0x3f, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, + 0x18, 0x2f, 0x2f, 0x10, 0xed, 0x10, 0xed, 0x01, 0x10, 0xd4, 0xc6, 0x10, 0xc2, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x33, 0x10, 0xed, 0x32, 0x10, 0xd0, 0x87, 0x2b, 0x87, 0x7d, 0xc4, + 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x05, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, + 0x13, 0x01, 0x23, 0x01, 0x1e, 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3b, 0x14, 0x16, 0x1a, 0x13, 0x0f, + 0x0b, 0x11, 0x28, 0x09, 0x16, 0x0e, 0x38, 0x1e, 0x34, 0x30, 0x0d, 0x11, 0x2a, 0x13, 0x22, 0x2d, + 0x1b, 0x1c, 0x33, 0x10, 0x01, 0xbf, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, 0x20, 0x18, 0x10, 0x19, + 0x0a, 0x33, 0x57, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbd, 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, + 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, 0x1a, 0x13, 0x1a, 0x0b, 0x14, 0x2b, + 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0x86, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, 0x40, + 0x17, 0x29, 0x14, 0x02, 0x05, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, + 0xff, 0x56, 0x01, 0xb2, 0x01, 0xd2, 0x00, 0x20, 0x00, 0x32, 0x00, 0x43, 0xb9, 0x00, 0x11, 0xff, + 0xc0, 0x40, 0x13, 0x0d, 0x10, 0x48, 0x11, 0x34, 0x29, 0x71, 0x50, 0x21, 0x60, 0x21, 0x70, 0x21, + 0x03, 0x21, 0x33, 0x0a, 0x70, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0b, 0x10, 0x48, 0x19, 0x33, + 0x00, 0x2e, 0x75, 0x24, 0x0b, 0x10, 0x0d, 0x67, 0x14, 0x12, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, + 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x10, 0xc6, 0x2b, 0x31, 0x30, 0x25, + 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x04, 0x35, 0x27, 0x34, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x01, 0x51, 0x01, 0x2a, 0x22, 0x0b, 0x17, + 0x12, 0x0b, 0x2a, 0x20, 0x20, 0x3c, 0x23, 0x22, 0x23, 0x5e, 0x2e, 0x39, 0x4a, 0x2a, 0x11, 0x17, + 0x23, 0x28, 0x23, 0x17, 0x23, 0x33, 0x20, 0x10, 0x1e, 0x18, 0x0e, 0x0e, 0x18, 0x1e, 0x10, 0x10, + 0x1e, 0x17, 0x0e, 0xe5, 0x05, 0x0a, 0x28, 0x49, 0x1c, 0x09, 0x12, 0x12, 0x15, 0x0c, 0x1e, 0x1f, + 0x13, 0x11, 0x5e, 0x16, 0x18, 0x1e, 0x2f, 0x37, 0x19, 0x1d, 0x2f, 0x27, 0x23, 0x22, 0x24, 0x16, + 0x9a, 0x27, 0x2c, 0x0b, 0x16, 0x1f, 0x13, 0x13, 0x1f, 0x15, 0x0b, 0x0b, 0x15, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfc, 0x40, + 0x09, 0x1a, 0x18, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x19, 0x17, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x18, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x1b, 0x17, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x18, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x2b, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0xff, 0xff, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x25, 0x17, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x24, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x03, 0x02, 0x01, 0x19, 0x2b, 0x04, 0x0b, 0x50, 0x03, 0x07, 0x23, 0x4f, 0x02, 0x07, 0x17, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x14, 0x00, 0x18, 0x00, 0x23, 0x00, 0x2f, 0x00, 0xb5, 0xb5, 0x22, 0x38, 0x0c, 0x00, 0x4d, + 0x21, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xe0, 0xb6, 0x0c, 0x00, 0x4d, + 0x34, 0x1d, 0x01, 0x18, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, + 0x13, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0xb3, + 0x0c, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xe0, 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x04, 0xb8, 0xff, 0xf0, + 0xb3, 0x0e, 0x00, 0x4d, 0x04, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x31, 0x0c, 0x00, 0x4d, 0x1e, 0x0e, 0x09, 0x11, 0x0a, 0x05, 0x30, 0x2a, 0x07, 0x00, 0x08, + 0x03, 0x1f, 0x05, 0x24, 0x2a, 0x19, 0x24, 0x24, 0x19, 0x2a, 0x03, 0x30, 0x20, 0x06, 0xc0, 0x06, + 0x02, 0x06, 0x31, 0x0b, 0x30, 0x1e, 0x1f, 0x48, 0x09, 0x09, 0x08, 0x08, 0x07, 0x19, 0x0a, 0x0a, + 0x08, 0x07, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x10, 0xed, 0x32, 0x01, 0x10, + 0xc6, 0x10, 0xc6, 0x5d, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x17, 0x39, 0x11, 0x12, 0x17, + 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x01, + 0x14, 0x06, 0x07, 0x16, 0x12, 0x17, 0x23, 0x27, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x26, 0x26, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x37, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x63, 0x12, 0x0f, 0x2b, 0x56, + 0x28, 0x84, 0x1d, 0xa5, 0x1c, 0x80, 0x2b, 0x57, 0x29, 0x10, 0x13, 0x11, 0x1d, 0x26, 0x14, 0x2b, + 0x3f, 0x6a, 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x1f, 0x18, 0x11, 0x0f, + 0x19, 0x19, 0x0f, 0x11, 0x18, 0x02, 0xad, 0x1a, 0x26, 0x0e, 0x86, 0xfe, 0xd5, 0xae, 0x8f, 0x8f, + 0xb2, 0x01, 0x27, 0x84, 0x0d, 0x28, 0x1b, 0x19, 0x27, 0x1a, 0x0d, 0x34, 0xed, 0x23, 0x3f, 0x3d, + 0x3e, 0x21, 0x21, 0x3e, 0x3d, 0x3f, 0xdd, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x13, 0x00, 0x18, 0x00, 0x9c, + 0xb9, 0x00, 0x16, 0xff, 0xc0, 0x40, 0x0a, 0x09, 0x0c, 0x00, 0x4c, 0x12, 0x40, 0x0b, 0x00, 0x4d, + 0x0e, 0xb8, 0xff, 0xc0, 0xb4, 0x0c, 0x0d, 0x00, 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x49, 0x0c, + 0x0d, 0x00, 0x4c, 0x09, 0x40, 0x0b, 0x00, 0x4d, 0x17, 0x01, 0x02, 0x03, 0x03, 0x14, 0x13, 0x00, + 0x10, 0x0e, 0x0d, 0x0a, 0x14, 0x18, 0x00, 0x10, 0x0f, 0x0c, 0x0b, 0x0d, 0x0a, 0x0a, 0x0d, 0x0b, + 0x0c, 0x0f, 0x10, 0x00, 0x18, 0x14, 0x09, 0x12, 0x08, 0x03, 0x19, 0x0f, 0x12, 0x01, 0x12, 0x18, + 0x48, 0x14, 0x00, 0x00, 0x08, 0x13, 0x08, 0x0e, 0x48, 0x0d, 0x0d, 0x09, 0x11, 0x48, 0x12, 0x08, + 0x0a, 0x48, 0x09, 0x02, 0x08, 0x02, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x12, + 0x39, 0x2f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0xed, 0x01, 0x2f, 0x5d, 0x10, 0xd6, 0xc5, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, + 0x39, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x23, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x06, + 0x06, 0x07, 0x33, 0xff, 0x5b, 0x1b, 0x80, 0x1a, 0x2c, 0x2c, 0x2e, 0x1d, 0x01, 0x18, 0x6f, 0x58, + 0x58, 0x7c, 0xec, 0x11, 0x22, 0x12, 0x45, 0x8f, 0x8f, 0x6a, 0xa1, 0x8c, 0x85, 0x4f, 0x66, 0x8a, + 0x66, 0xaf, 0x66, 0x02, 0x18, 0x45, 0x8b, 0x53, 0x00, 0x01, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd5, + 0x02, 0x79, 0x00, 0x36, 0x00, 0x4d, 0x40, 0x2c, 0x32, 0x20, 0x0d, 0x0e, 0x00, 0x4c, 0x32, 0x40, + 0x0b, 0x00, 0x4d, 0x24, 0x23, 0x33, 0x38, 0x32, 0x38, 0x2c, 0x46, 0x19, 0x37, 0x03, 0x10, 0x0a, + 0x37, 0x32, 0x4a, 0x33, 0x36, 0x09, 0x24, 0x4a, 0x23, 0x27, 0x4a, 0x1e, 0x03, 0x2f, 0x4a, 0x16, + 0x09, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x3f, 0xed, 0xd5, 0xed, 0x3f, 0xd5, 0xe9, + 0x01, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0xed, 0x11, 0x33, 0x10, 0xd6, 0xc6, 0x32, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, + 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x01, 0x2c, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, + 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x02, 0x08, 0x04, 0x61, 0x67, 0x2a, 0x4b, 0x67, 0x3d, + 0x21, 0x35, 0x28, 0x1b, 0x07, 0x20, 0x17, 0x41, 0x2a, 0x1d, 0x37, 0x2b, 0x1b, 0x49, 0x53, 0x30, + 0x3f, 0x13, 0x1f, 0x19, 0x55, 0x37, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, + 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x09, 0x14, 0x08, 0x15, 0xa1, 0x86, 0x4d, 0x78, 0x53, 0x2b, + 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0f, 0x15, 0x15, 0x31, 0x52, 0x3d, 0x6a, 0x71, 0x16, 0x0b, 0x61, + 0x0f, 0x1a, 0x02, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf0, 0x40, 0x09, 0x0f, 0x0d, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0e, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf4, 0x40, 0x09, 0x0e, 0x0c, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0d, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf6, 0x40, 0x09, 0x10, 0x0c, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0d, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, + 0x01, 0xb8, 0xff, 0xf6, 0x40, 0x0d, 0x0e, 0x20, 0x00, 0x0a, 0x50, 0x02, 0x01, 0x18, 0x4f, 0x01, + 0x01, 0x0c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x0f, 0x0d, 0x00, 0x06, 0x50, 0x01, 0x05, + 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x0e, 0x0c, 0x00, 0x06, 0x50, 0x01, 0x05, + 0x0d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x10, 0x0c, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0d, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x02, 0x01, 0x01, 0x0e, 0x20, 0x00, 0x06, 0x50, 0x02, 0x05, 0x18, 0x4f, 0x01, 0x05, 0x0c, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd9, + 0x02, 0x72, 0x00, 0x14, 0x00, 0x29, 0x00, 0x49, 0x40, 0x2b, 0x2f, 0x21, 0x3f, 0x21, 0x02, 0x21, + 0x46, 0x80, 0x00, 0x90, 0x00, 0x02, 0x00, 0x2b, 0x16, 0x18, 0x29, 0x44, 0x08, 0x0f, 0x0d, 0x01, + 0x0d, 0x0b, 0x2a, 0x18, 0x09, 0x15, 0x0c, 0x0c, 0x15, 0x09, 0x18, 0x04, 0x05, 0x26, 0x4a, 0x10, + 0x02, 0x1c, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x2f, 0x01, 0x10, 0xd6, 0xd6, 0x5d, 0x32, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, + 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x05, 0x33, 0x15, 0x23, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x01, 0xd9, 0x29, 0x49, 0x64, 0x3c, 0x20, 0x3d, 0x23, + 0x35, 0x35, 0x2a, 0x46, 0x20, 0x3a, 0x60, 0x43, 0x25, 0xfe, 0xea, 0x4c, 0x4c, 0x04, 0x09, 0x05, + 0x26, 0x34, 0x1f, 0x0e, 0x0a, 0x1b, 0x30, 0x25, 0x08, 0x10, 0x07, 0x01, 0x36, 0x56, 0x79, 0x4c, + 0x23, 0x07, 0x08, 0x01, 0x07, 0x66, 0xef, 0x09, 0x06, 0x24, 0x4d, 0x77, 0x16, 0x66, 0xaa, 0x01, + 0x20, 0x38, 0x4d, 0x2e, 0x28, 0x4c, 0x3a, 0x23, 0x01, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x03, 0x2b, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x1e, 0x10, 0x05, 0x0e, 0x50, 0x01, + 0x06, 0x1d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfc, 0x40, 0x09, 0x23, 0x21, 0x14, 0x19, 0x50, 0x02, 0x16, + 0x22, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x22, 0x20, 0x14, 0x19, 0x50, 0x02, 0x16, 0x21, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x01, 0x24, 0x20, 0x14, 0x19, 0x50, 0x02, 0x16, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2b, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x2e, 0x20, + 0x14, 0x19, 0x50, 0x02, 0x16, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x14, 0x19, 0x50, + 0x03, 0x16, 0x2c, 0x4f, 0x02, 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3c, 0x00, 0x46, 0x01, 0xc2, 0x01, 0xcc, 0x00, 0x0b, 0x00, 0x74, 0xb9, 0x00, + 0x06, 0xff, 0xe0, 0xb3, 0x0f, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xf0, 0x40, 0x09, 0x0f, 0x00, 0x4d, + 0x0a, 0x08, 0x0f, 0x00, 0x4d, 0x06, 0xb8, 0xff, 0xf0, 0xb3, 0x13, 0x00, 0x4d, 0x06, 0xb8, 0xff, + 0xf8, 0xb4, 0x11, 0x12, 0x00, 0x4c, 0x06, 0xb8, 0xff, 0xf0, 0x40, 0x21, 0x10, 0x00, 0x4d, 0xb7, + 0x06, 0x01, 0x03, 0x01, 0x0d, 0x09, 0x07, 0x0c, 0x01, 0x09, 0x0a, 0x02, 0x08, 0x0b, 0x06, 0x04, + 0x07, 0x03, 0x04, 0x05, 0x0b, 0x05, 0x0b, 0x05, 0x0d, 0x0a, 0x06, 0x00, 0x06, 0x00, 0x3f, 0x3f, + 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x17, 0x39, 0x12, 0x39, 0x39, 0x11, 0x39, 0x39, 0x01, + 0x18, 0x10, 0xc6, 0xc6, 0x10, 0xc6, 0xc6, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x01, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x01, 0x7b, + 0x46, 0x7d, 0x7e, 0x47, 0x7d, 0x7d, 0x45, 0x7d, 0x7d, 0x45, 0x7d, 0x01, 0xcb, 0x47, 0x7c, 0x7d, + 0x45, 0x7e, 0x7e, 0x44, 0x7d, 0x7d, 0x48, 0x7d, 0x00, 0x03, 0x00, 0x1b, 0xff, 0xd8, 0x01, 0xd9, + 0x02, 0x93, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x8e, 0xb9, 0x00, 0x11, 0xff, 0xe0, 0x40, + 0x0a, 0x17, 0x00, 0x4d, 0x07, 0x20, 0x11, 0x12, 0x00, 0x4c, 0x10, 0xb8, 0xff, 0xe0, 0x40, 0x46, + 0x0d, 0x0e, 0x00, 0x4c, 0x14, 0x46, 0x5f, 0x0a, 0x01, 0x0a, 0x40, 0x09, 0x0c, 0x48, 0x0a, 0x2a, + 0x0f, 0x10, 0x12, 0x11, 0x04, 0x29, 0x18, 0x21, 0x22, 0x06, 0x05, 0x07, 0x08, 0x2a, 0x21, 0x22, + 0x17, 0x05, 0x08, 0x08, 0x05, 0x17, 0x22, 0x21, 0x05, 0x29, 0x2a, 0x1f, 0x46, 0x00, 0x29, 0x11, + 0x08, 0x10, 0x91, 0x22, 0x17, 0x18, 0x21, 0x17, 0x03, 0x24, 0x1a, 0x4a, 0x0d, 0x09, 0x07, 0x02, + 0x06, 0x90, 0x24, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x11, 0x17, 0x39, + 0x10, 0xc5, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x11, 0x12, 0x39, 0x11, 0x39, 0x11, 0x12, 0x39, 0x11, 0x17, 0x39, 0x10, 0xde, 0x2b, 0x5d, + 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x17, + 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x25, 0x34, 0x26, 0x27, + 0x03, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x27, 0x14, 0x17, 0x13, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x1b, + 0x76, 0x69, 0x37, 0x27, 0x17, 0x50, 0x22, 0x3c, 0x74, 0x6a, 0x39, 0x2c, 0x17, 0x4f, 0x22, 0x37, + 0x01, 0x41, 0x03, 0x02, 0x91, 0x16, 0x1e, 0x1f, 0x27, 0x15, 0x07, 0xc4, 0x03, 0x8d, 0x13, 0x1b, + 0x20, 0x26, 0x15, 0x07, 0x01, 0x34, 0xa0, 0xa3, 0x13, 0x2f, 0x28, 0x43, 0x53, 0xa1, 0xa0, 0xa3, + 0x17, 0x30, 0x28, 0x47, 0x52, 0x9b, 0x1a, 0x31, 0x16, 0xfe, 0xd8, 0x11, 0x22, 0x3b, 0x4e, 0x2d, + 0x30, 0x27, 0x01, 0x22, 0x0d, 0x22, 0x3b, 0x4e, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xe7, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf3, 0x40, 0x09, 0x1d, 0x1b, 0x04, 0x14, 0x50, 0x01, 0x06, + 0x1c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x04, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0f, 0x1c, 0x1a, 0x04, 0x14, 0x50, 0x01, 0x06, 0x1b, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x1e, 0x1a, 0x04, 0x14, 0x50, 0x01, 0x06, 0x1b, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1c, + 0x2e, 0x04, 0x14, 0x50, 0x02, 0x06, 0x26, 0x4f, 0x01, 0x06, 0x1a, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x0f, 0x17, 0x15, 0x11, 0x06, 0x50, 0x01, 0x05, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x44, + 0x40, 0x28, 0x17, 0x53, 0x1f, 0x03, 0x01, 0x03, 0x1b, 0x12, 0x07, 0x0b, 0x51, 0x20, 0x0a, 0x30, + 0x0a, 0x50, 0x0a, 0x03, 0x0a, 0x1a, 0x12, 0x57, 0x0c, 0x07, 0x57, 0x13, 0x5f, 0x13, 0x6f, 0x13, + 0x02, 0x0c, 0x13, 0x0c, 0x13, 0x08, 0x0a, 0x02, 0x08, 0x08, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x5d, 0x10, 0xed, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x32, 0x10, 0xde, + 0x5d, 0xed, 0x31, 0x30, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, 0x23, 0x11, 0x33, + 0x15, 0x36, 0x32, 0x17, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xe0, 0x77, + 0x81, 0x82, 0x79, 0x2c, 0x7b, 0x7b, 0x0d, 0x17, 0x19, 0x0b, 0x27, 0x0b, 0x32, 0x3b, 0x3c, 0x3b, + 0x02, 0x13, 0x66, 0x69, 0x68, 0x6a, 0x72, 0x02, 0x6b, 0x59, 0x01, 0x6b, 0x01, 0x02, 0xc8, 0x36, + 0x32, 0x30, 0x33, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xec, 0x02, 0xb5, 0x00, 0x36, + 0x00, 0x7e, 0x40, 0x2d, 0x21, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x20, 0x40, 0x0b, 0x0c, 0x00, 0x4c, + 0x1f, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x1e, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x1c, 0x40, 0x0c, 0x00, + 0x4d, 0x14, 0x40, 0x0b, 0x00, 0x4d, 0x13, 0x40, 0x0b, 0x00, 0x4d, 0x07, 0x40, 0x0c, 0x00, 0x4d, + 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x27, 0x0c, 0x0e, 0x00, 0x4c, 0x1f, 0x53, 0x05, 0x0c, 0x24, 0x53, + 0x00, 0x19, 0x53, 0x0c, 0x38, 0x12, 0x40, 0x0a, 0x00, 0x4d, 0x0f, 0x12, 0x01, 0x12, 0x2a, 0x51, + 0x2d, 0x37, 0x27, 0x57, 0x32, 0x00, 0x2b, 0x06, 0x13, 0x16, 0x57, 0x0f, 0x07, 0x00, 0x3f, 0xfd, + 0xce, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc6, 0x5d, 0x2b, 0x10, 0xd6, 0xed, 0xd4, 0xed, + 0x10, 0xd4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x14, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x01, 0x98, 0x15, 0x18, 0x15, 0x16, 0x22, 0x26, 0x22, 0x16, 0x4d, 0x5e, 0x2f, 0x37, 0x11, 0x16, + 0x11, 0x33, 0x15, 0x1b, 0x1b, 0x2b, 0x22, 0x2d, 0x18, 0x16, 0x1a, 0x16, 0x20, 0x1d, 0x26, 0x26, + 0x7b, 0x16, 0x30, 0x4a, 0x34, 0x32, 0x45, 0x2b, 0x13, 0x02, 0x21, 0x2b, 0x31, 0x23, 0x22, 0x1d, + 0x15, 0x1d, 0x19, 0x18, 0x1f, 0x2d, 0x20, 0x4d, 0x52, 0x11, 0x08, 0x66, 0x08, 0x0f, 0x1d, 0x18, + 0x18, 0x24, 0x11, 0x18, 0x3b, 0x20, 0x23, 0x2c, 0x25, 0x2a, 0x22, 0x1d, 0x1d, 0x3a, 0x33, 0xfe, + 0x21, 0x01, 0xdc, 0x2f, 0x50, 0x3a, 0x20, 0x18, 0x29, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xef, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x32, 0x30, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x31, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x13, + 0x31, 0x2f, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x30, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x08, 0x33, 0x2f, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x30, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa0, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x09, + 0x3d, 0x2f, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x3c, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x09, 0x31, 0x43, 0x1c, 0x13, 0x50, 0x03, 0x0f, + 0x3b, 0x4f, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xc3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x63, + 0x00, 0x00, 0x00, 0x14, 0x40, 0x0d, 0x03, 0x02, 0x07, 0x36, 0x2f, 0x1c, 0x13, 0x50, 0x03, 0x02, + 0x0f, 0x32, 0x4f, 0x2b, 0x34, 0x2b, 0x34, 0x34, 0x00, 0x03, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, + 0x01, 0xe2, 0x00, 0x36, 0x00, 0x44, 0x00, 0x4f, 0x00, 0x8e, 0xb5, 0x4d, 0x20, 0x0b, 0x00, 0x4d, + 0x42, 0xb8, 0xff, 0xe0, 0xb6, 0x1a, 0x00, 0x4d, 0x04, 0x42, 0x01, 0x2d, 0xb8, 0xff, 0xe0, 0xb3, + 0x17, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0x60, 0x40, 0x43, 0x0d, 0x00, 0x4d, 0x2f, 0x40, 0x0d, 0x00, + 0x4d, 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x20, 0x4a, 0x30, 0x4a, 0x02, 0x4a, 0x52, 0x2c, 0x2c, 0x50, + 0x51, 0x0e, 0x18, 0x51, 0x3d, 0x52, 0x34, 0x26, 0x50, 0x40, 0x57, 0x21, 0x07, 0x30, 0x3a, 0x01, + 0x30, 0x0f, 0x01, 0x29, 0x4a, 0x3a, 0x0f, 0x0f, 0x3a, 0x4a, 0x29, 0x04, 0x06, 0x14, 0x57, 0x1b, + 0x07, 0x45, 0x57, 0x06, 0x0b, 0x4f, 0x30, 0x01, 0x30, 0x57, 0x00, 0x0b, 0x00, 0x3f, 0xed, 0x5d, + 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0xc6, 0x11, 0x12, 0x39, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x13, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x14, 0x07, 0x23, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x13, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x26, 0x37, 0x22, 0x0e, 0x02, 0x15, 0x33, 0x34, + 0x2e, 0x02, 0xa3, 0x1f, 0x37, 0x15, 0x11, 0x2a, 0x19, 0x1d, 0x31, 0x24, 0x14, 0x02, 0xb3, 0x01, + 0x0e, 0x16, 0x1c, 0x10, 0x12, 0x23, 0x0e, 0x12, 0x17, 0x2d, 0x1e, 0x23, 0x32, 0x11, 0x17, 0x3b, + 0x1d, 0x22, 0x34, 0x23, 0x12, 0x4d, 0x3c, 0x0d, 0x1a, 0x0e, 0x1f, 0x1b, 0x11, 0x27, 0x17, 0x11, + 0x1a, 0x34, 0x4c, 0x09, 0x13, 0x08, 0x1a, 0x21, 0x1c, 0x1b, 0x17, 0x1a, 0x06, 0x03, 0x8d, 0x0d, + 0x11, 0x0b, 0x05, 0x58, 0x04, 0x09, 0x10, 0x01, 0xe2, 0x19, 0x1d, 0x1a, 0x1c, 0x18, 0x36, 0x58, + 0x40, 0x0c, 0x23, 0x0a, 0x1c, 0x27, 0x19, 0x0b, 0x09, 0x08, 0x61, 0x0c, 0x0b, 0x1c, 0x15, 0x1a, + 0x17, 0x1b, 0x2c, 0x38, 0x1d, 0x44, 0x4d, 0x03, 0x05, 0x17, 0x2c, 0x22, 0x0b, 0x08, 0x5f, 0x0b, + 0x0c, 0xfe, 0xe5, 0x03, 0x02, 0x1a, 0x20, 0x1b, 0x20, 0x0c, 0x1a, 0x34, 0xcf, 0x13, 0x1e, 0x25, + 0x12, 0x13, 0x26, 0x1d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2c, 0xff, 0x56, 0x01, 0xd2, + 0x01, 0xe2, 0x00, 0x36, 0x00, 0x4c, 0xb4, 0x08, 0x00, 0x18, 0x01, 0x18, 0xb8, 0xff, 0xc0, 0x40, + 0x0c, 0x0b, 0x0f, 0x48, 0x18, 0x38, 0x20, 0x2d, 0x27, 0x37, 0x11, 0x53, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x15, 0x0c, 0x0f, 0x48, 0x00, 0x37, 0x17, 0x14, 0x57, 0x32, 0x06, 0x28, 0x2b, 0x25, 0x92, + 0x1c, 0x07, 0x09, 0x0c, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xd5, 0xc6, 0x3f, + 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xc6, + 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x23, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, + 0x36, 0x37, 0x2e, 0x03, 0x2c, 0x20, 0x42, 0x65, 0x46, 0x2a, 0x44, 0x23, 0x1b, 0x14, 0x31, 0x26, + 0x2c, 0x3b, 0x24, 0x10, 0x49, 0x58, 0x1d, 0x3f, 0x1a, 0x12, 0x1a, 0x4a, 0x32, 0x0b, 0x05, 0x21, + 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x06, 0x0a, + 0x31, 0x46, 0x2d, 0x15, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x0c, 0x0e, 0x63, 0x07, 0x0b, 0x15, 0x25, + 0x34, 0x1e, 0x41, 0x4a, 0x08, 0x09, 0x65, 0x0a, 0x0d, 0x0d, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, + 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x15, 0x14, 0x0a, 0x2c, 0x3e, 0x4d, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x43, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfd, 0x40, 0x09, 0x29, + 0x27, 0x00, 0x07, 0x50, 0x02, 0x04, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, + 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x16, 0x28, 0x26, 0x00, 0x07, 0x50, 0x02, 0x04, 0x27, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x04, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x07, + 0x2a, 0x26, 0x00, 0x07, 0x50, 0x02, 0x04, 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x03, 0x28, 0x3a, 0x00, 0x07, 0x50, 0x03, 0x04, + 0x32, 0x4f, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb3, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xe7, 0x40, 0x09, 0x17, 0x15, 0x0a, 0x00, 0x50, + 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xb3, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf4, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x16, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x15, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb3, 0x02, 0x26, + 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xef, 0x40, 0x09, 0x18, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xa1, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0xef, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xef, 0x40, 0x0d, + 0x16, 0x28, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x20, 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xe0, 0x02, 0xb9, 0x00, 0x23, + 0x00, 0x34, 0x00, 0x5f, 0xb6, 0x01, 0x20, 0x13, 0x14, 0x00, 0x4c, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x2e, 0x0a, 0x00, 0x4d, 0x15, 0x32, 0x53, 0x03, 0x00, 0x23, 0xa0, 0x23, 0x02, 0x23, 0x36, 0x1a, + 0x1e, 0x35, 0x2a, 0x53, 0x0d, 0x35, 0x1f, 0x10, 0x24, 0x57, 0x15, 0x27, 0x57, 0x12, 0x00, 0x19, + 0x73, 0x1a, 0x21, 0x1a, 0x1a, 0x23, 0x1e, 0x15, 0x15, 0x1e, 0x02, 0x2f, 0x57, 0x08, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x10, 0xfd, 0x32, 0xd6, 0xed, 0x10, + 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0xc6, 0x10, 0xd6, 0x5d, 0xd6, 0xfd, 0xc4, 0x31, + 0x30, 0x2b, 0x2b, 0x01, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x26, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x27, 0x37, + 0x16, 0x17, 0x37, 0x17, 0x03, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x01, 0x87, 0x20, 0x20, 0x15, 0x30, 0x50, 0x3c, 0x34, 0x4d, 0x33, 0x1a, + 0x19, 0x31, 0x4b, 0x33, 0x14, 0x2c, 0x11, 0x05, 0x14, 0x10, 0x5c, 0x1a, 0x44, 0x0e, 0x20, 0x12, + 0x4a, 0x3d, 0x2d, 0x6d, 0x19, 0x99, 0x18, 0x2b, 0x0b, 0x2a, 0x29, 0x0a, 0x13, 0x1c, 0x12, 0x30, + 0x27, 0x01, 0x02, 0x17, 0x3c, 0x85, 0x42, 0x3a, 0x69, 0x4f, 0x2f, 0x23, 0x3c, 0x51, 0x2e, 0x2b, + 0x4d, 0x3a, 0x22, 0x0e, 0x09, 0x17, 0x32, 0x1a, 0x1f, 0x4b, 0x17, 0x10, 0x1b, 0x0d, 0x4d, 0x24, + 0x39, 0x24, 0x4b, 0xfe, 0xf1, 0x15, 0x08, 0x3c, 0x36, 0x16, 0x29, 0x20, 0x14, 0x5f, 0x4e, 0x07, + 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xa0, 0x02, 0x26, + 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, + 0x22, 0x14, 0x00, 0x07, 0x50, 0x01, 0x02, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, + 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfa, 0x40, 0x09, 0x23, 0x21, 0x09, 0x00, 0x50, + 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf8, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x03, 0x22, 0x20, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x24, 0x20, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xa0, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x2c, 0x4f, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x03, 0x00, 0x28, 0x00, 0x05, 0x01, 0xcc, 0x02, 0x06, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, + 0x00, 0x5c, 0x40, 0x10, 0x1a, 0x40, 0x14, 0x00, 0x4d, 0x19, 0x40, 0x14, 0x00, 0x4d, 0x19, 0x40, + 0x0e, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x18, 0xb8, 0xff, 0xc0, 0x40, + 0x20, 0x12, 0x00, 0x4d, 0x19, 0x1d, 0x0c, 0x95, 0x12, 0x1c, 0x00, 0x95, 0x06, 0x1b, 0x1c, 0x19, + 0x79, 0x1a, 0x1a, 0x09, 0x15, 0x96, 0x0f, 0x07, 0x03, 0x96, 0x80, 0x09, 0xc0, 0x09, 0x02, 0x09, + 0x7e, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xc6, 0xd4, 0xed, + 0x10, 0xd6, 0xed, 0x10, 0xc6, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x21, 0x15, 0x21, 0x01, 0x41, 0x2a, 0x1b, 0x1d, 0x2a, + 0x2a, 0x1d, 0x1b, 0x2a, 0x2a, 0x1b, 0x1d, 0x2a, 0x2a, 0x1d, 0x1b, 0x2a, 0xfe, 0xe7, 0x01, 0xa4, + 0xfe, 0x5c, 0x01, 0xbc, 0x24, 0x25, 0x25, 0x24, 0x24, 0x26, 0x26, 0xfe, 0x6f, 0x23, 0x27, 0x27, + 0x23, 0x24, 0x27, 0x27, 0xc6, 0x65, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, 0xff, 0xda, 0x01, 0xd8, + 0x01, 0xf6, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x43, 0xb5, 0x1e, 0x40, 0x0a, 0x00, 0x4d, + 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x10, 0x00, 0x4d, 0x20, 0x00, 0x01, 0x00, 0x53, 0x27, 0x1e, + 0x53, 0xc0, 0x0e, 0xd0, 0x0e, 0x02, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0d, 0x10, 0x48, 0x0e, + 0x0a, 0x2d, 0x21, 0x57, 0x13, 0x0b, 0x2a, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xd4, 0x2b, 0x5d, 0xfd, 0xd5, 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, 0x05, 0x14, 0x16, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x17, + 0x34, 0x26, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x01, 0xd8, 0x20, 0x3a, 0x51, 0x32, 0x20, 0x38, + 0x19, 0x26, 0x3e, 0x29, 0x18, 0x1a, 0x21, 0x3b, 0x52, 0x30, 0x3e, 0x32, 0x25, 0x3f, 0x2a, 0x18, + 0x1b, 0xfe, 0xc2, 0x02, 0x03, 0x89, 0x13, 0x1a, 0x30, 0x31, 0xc0, 0x02, 0x03, 0x89, 0x13, 0x1a, + 0x30, 0x31, 0xea, 0x38, 0x5b, 0x42, 0x24, 0x0f, 0x0d, 0x33, 0x2f, 0x39, 0x20, 0x55, 0x33, 0x37, + 0x5b, 0x41, 0x23, 0x1d, 0x33, 0x2f, 0x39, 0x20, 0x52, 0x33, 0x10, 0x1d, 0x0e, 0xbc, 0x0b, 0x4d, + 0x3f, 0x10, 0x1b, 0x0d, 0xb9, 0x0c, 0x4e, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xef, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfc, 0x40, 0x09, 0x16, 0x14, 0x07, 0x00, 0x50, 0x01, 0x09, 0x15, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf4, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, + 0x15, 0x13, 0x07, 0x00, 0x50, 0x01, 0x09, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3b, + 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x02, 0x17, 0x13, 0x07, 0x00, 0x50, 0x01, 0x09, 0x14, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xa1, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x03, 0x15, 0x27, 0x07, 0x00, 0x50, 0x02, 0x09, 0x1f, 0x4f, 0x01, 0x09, 0x13, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf4, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x25, 0x23, 0x0d, 0x00, 0x50, 0x01, 0x00, 0x24, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x02, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd5, 0x02, 0xb6, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x4d, 0xb2, 0x12, 0x53, 0x00, + 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x09, 0x0f, 0x48, + 0x00, 0x20, 0x18, 0x07, 0x0c, 0x51, 0xf0, 0x0a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x09, + 0x10, 0x48, 0x0a, 0x1f, 0x15, 0x57, 0x0f, 0x07, 0x0b, 0x01, 0x0a, 0x00, 0x08, 0x0e, 0x1c, 0x57, + 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, + 0x32, 0x32, 0x10, 0xd6, 0x2b, 0x2b, 0xed, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, + 0x15, 0x23, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0xd5, 0x18, 0x2e, 0x46, 0x2e, 0x2f, 0x32, 0x7b, + 0x7b, 0x0e, 0x1e, 0x0e, 0x6d, 0x74, 0x7d, 0x32, 0x33, 0x0e, 0x20, 0x0b, 0x0c, 0x28, 0x14, 0x2c, + 0x2a, 0xeb, 0x36, 0x5b, 0x41, 0x24, 0x17, 0xb1, 0x03, 0x46, 0x15, 0xde, 0x03, 0x05, 0x84, 0x75, + 0x3f, 0x51, 0x03, 0x01, 0xfe, 0xfe, 0x08, 0x0a, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, + 0xff, 0x58, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x05, 0x25, 0x37, 0x0d, 0x00, 0x50, 0x02, 0x00, + 0x2f, 0x4f, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x12, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, + 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x17, 0x18, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0x87, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0xff, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x08, 0x2f, 0x30, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x31, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x35, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x1b, 0x25, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xaa, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x07, 0x33, 0x3d, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x2f, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x02, 0x00, 0x09, 0xff, 0x56, 0x01, 0xf9, 0x02, 0x6b, 0x00, 0x0a, + 0x00, 0x2c, 0x00, 0x40, 0x40, 0x24, 0x28, 0x1b, 0x21, 0x0b, 0x0c, 0x13, 0x06, 0x00, 0x05, 0x12, + 0x0d, 0x0e, 0x09, 0x0f, 0x16, 0x2e, 0x0f, 0x2d, 0x1e, 0x25, 0x92, 0x0c, 0x4a, 0x06, 0x06, 0x00, + 0x0b, 0x13, 0x02, 0x12, 0x02, 0x0e, 0x08, 0x16, 0x0b, 0x08, 0x00, 0x3f, 0x33, 0x3f, 0x3f, 0x3f, + 0x12, 0x39, 0x39, 0x10, 0xed, 0x3f, 0xcd, 0x01, 0x10, 0xc6, 0x10, 0xd6, 0x11, 0x17, 0x39, 0xd6, + 0xde, 0xc5, 0x31, 0x30, 0x13, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x13, 0x27, 0x23, 0x07, 0x23, + 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0xf9, 0x0a, 0x11, 0x0f, 0x0d, + 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x64, 0x1d, 0xa5, 0x1c, 0x80, 0x2c, 0x5a, 0x2a, 0x86, 0x2c, + 0x57, 0x29, 0x09, 0x17, 0x14, 0x0d, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, 0x33, 0x1c, 0x30, + 0x2a, 0x1b, 0x1a, 0x09, 0x01, 0xf3, 0x23, 0x3f, 0x3d, 0x3e, 0x21, 0x21, 0x3e, 0x3d, 0x3f, 0xfe, + 0x30, 0x8f, 0x8f, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, 0xb2, 0x08, 0x14, 0x16, 0x16, 0x09, + 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, 0x25, 0x1b, 0x18, 0x36, 0x14, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x2c, 0xff, 0x56, 0x01, 0xb9, 0x01, 0xe2, 0x00, 0x34, 0x00, 0x43, 0x00, 0x59, + 0x40, 0x35, 0x09, 0x53, 0x29, 0x45, 0x39, 0x18, 0x51, 0x28, 0x45, 0x06, 0x2e, 0x00, 0x45, 0x41, + 0x53, 0x20, 0x30, 0x11, 0x40, 0x11, 0x50, 0x11, 0x03, 0x11, 0x44, 0x40, 0x16, 0x50, 0x16, 0x60, + 0x16, 0x03, 0x16, 0x57, 0x3c, 0x3c, 0x0c, 0x4f, 0x1c, 0x01, 0x1c, 0x57, 0x23, 0x0b, 0x34, 0x06, + 0x03, 0x35, 0x57, 0x0c, 0x07, 0x03, 0x0f, 0x00, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x3f, 0xed, + 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0xdc, 0xc5, + 0x10, 0xde, 0xed, 0x32, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x37, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x27, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, + 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x01, 0xb7, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1d, 0x18, + 0x11, 0x22, 0x10, 0x2d, 0x49, 0x34, 0x1c, 0x20, 0x36, 0x46, 0x26, 0x30, 0x25, 0x2c, 0x36, 0x23, + 0x41, 0x14, 0x11, 0x17, 0x54, 0x2d, 0x3a, 0x4d, 0x2e, 0x14, 0x07, 0x1b, 0x1b, 0x14, 0x0b, 0x10, + 0x08, 0x16, 0x0f, 0xb5, 0x14, 0x26, 0x0e, 0x0c, 0x22, 0x0e, 0x13, 0x24, 0x1b, 0x10, 0x30, 0x9c, + 0x05, 0x09, 0x25, 0x1b, 0x18, 0x35, 0x16, 0x02, 0x02, 0x10, 0x25, 0x3b, 0x2b, 0x29, 0x38, 0x22, + 0x0f, 0x08, 0x0f, 0x23, 0x2f, 0x0a, 0x07, 0x63, 0x08, 0x0d, 0x1b, 0x31, 0x47, 0x2c, 0xfe, 0xea, + 0x05, 0x16, 0x1b, 0x1c, 0x0c, 0x0a, 0x0e, 0x02, 0x05, 0xba, 0x01, 0x02, 0x6c, 0x02, 0x03, 0x05, + 0x0c, 0x16, 0x12, 0x20, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x24, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x31, 0x22, 0x20, 0x02, 0x1d, 0x50, 0x01, 0x07, 0x21, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x1b, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x21, + 0x22, 0x20, 0x00, 0x18, 0x50, 0x01, 0x04, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, + 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x39, 0x24, 0x20, 0x02, 0x1d, 0x50, 0x01, + 0x07, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x2d, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x29, 0x24, 0x20, 0x00, 0x18, 0x50, 0x01, 0x04, 0x21, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x62, 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x38, 0x22, 0x28, + 0x02, 0x1d, 0x50, 0x01, 0x07, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xd2, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, + 0x36, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x31, 0x22, 0x28, 0x00, 0x18, 0x50, 0x01, 0x04, 0x20, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x39, 0x20, 0x24, 0x02, 0x1d, 0x50, 0x01, 0x07, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x5f, 0x36, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x32, 0x20, 0x24, 0x00, 0x18, + 0x50, 0x01, 0x04, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0xff, 0xdd, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xd1, 0x40, 0x09, 0x22, 0x26, 0x19, 0x11, 0x50, 0x02, 0x1c, + 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0d, 0xff, 0xf5, 0x02, 0x06, + 0x02, 0xb6, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x51, 0x40, 0x13, 0x18, 0x06, 0x51, 0x0c, + 0x1a, 0x5f, 0x1e, 0x01, 0x1e, 0x1b, 0x20, 0x20, 0x00, 0x30, 0x00, 0x02, 0x00, 0x53, 0x12, 0xb8, + 0xff, 0xc0, 0xb3, 0x15, 0x18, 0x48, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x09, 0x12, 0x48, 0x12, + 0x1f, 0x1e, 0x01, 0x1d, 0x0a, 0x1a, 0x01, 0x19, 0x00, 0x09, 0x57, 0x15, 0x07, 0x03, 0x57, 0x0f, + 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xde, 0x2b, 0x2b, 0xed, + 0x5d, 0x10, 0xd6, 0xd5, 0x5d, 0xde, 0xd0, 0xfd, 0xc0, 0x31, 0x30, 0x37, 0x14, 0x16, 0x33, 0x32, + 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x13, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x17, 0x35, 0x37, 0x17, 0x07, 0x23, 0x35, 0x8a, 0x21, 0x24, 0x16, 0x10, 0x0a, + 0x1c, 0x0f, 0x1d, 0x19, 0xe7, 0x1f, 0x59, 0x2b, 0x5f, 0x62, 0x50, 0x4e, 0x14, 0x28, 0x0e, 0x7c, + 0x95, 0x1d, 0x50, 0xee, 0x3f, 0x50, 0x04, 0x01, 0x00, 0x08, 0x0b, 0x46, 0xfe, 0xde, 0x0b, 0x0e, + 0x82, 0x71, 0x73, 0x85, 0x0b, 0x0a, 0xd6, 0x15, 0x01, 0xda, 0xda, 0x00, 0xff, 0xff, 0x00, 0x12, + 0xff, 0xf8, 0x01, 0xd9, 0x02, 0x72, 0x02, 0x06, 0x00, 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, + 0xff, 0xf5, 0x01, 0xe2, 0x02, 0xb6, 0x00, 0x16, 0x00, 0x23, 0x00, 0x40, 0x40, 0x23, 0x14, 0x10, + 0x1e, 0x53, 0x04, 0x02, 0x25, 0x17, 0x53, 0x13, 0x0a, 0x24, 0x16, 0x01, 0x15, 0x00, 0x02, 0x12, + 0x00, 0x13, 0x02, 0x1e, 0x55, 0x10, 0x21, 0x57, 0x30, 0x0d, 0x01, 0x0d, 0x0b, 0x1a, 0x57, 0x07, + 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x5d, 0xed, 0xd5, 0xed, 0x3f, 0x33, 0xcd, 0x32, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0xd6, 0xed, 0x32, 0x32, 0x31, 0x30, 0x01, 0x33, 0x15, 0x23, + 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x23, 0x35, + 0x33, 0x35, 0x37, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x01, 0xab, 0x37, 0x37, 0x23, 0x60, 0x30, 0x6d, 0x6f, 0x5e, 0x5b, 0x19, 0x30, 0x12, 0x80, 0x80, + 0x7b, 0xfe, 0xee, 0x2d, 0x33, 0x10, 0x19, 0x0e, 0x0e, 0x24, 0x14, 0x2a, 0x27, 0x02, 0x67, 0x53, + 0xfd, 0xfa, 0x0b, 0x0e, 0x82, 0x71, 0x73, 0x85, 0x0b, 0x0a, 0x49, 0x53, 0x3a, 0x15, 0xfe, 0x38, + 0x3f, 0x50, 0x02, 0x02, 0x01, 0x00, 0x08, 0x0b, 0x46, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xcc, 0x03, 0x12, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf7, 0x40, 0x09, 0x0c, 0x0d, 0x00, + 0x0a, 0x50, 0x01, 0x01, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0x87, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, + 0xff, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x03, 0x26, 0x27, 0x00, 0x07, 0x50, 0x02, 0x04, 0x28, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x35, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf5, 0x40, 0x09, 0x10, 0x1a, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0c, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xaa, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, + 0x2a, 0x34, 0x00, 0x07, 0x50, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xcc, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf5, 0x40, 0x09, 0x0e, 0x14, 0x00, + 0x0a, 0x50, 0x01, 0x01, 0x0c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x28, 0x2e, 0x00, 0x07, 0x50, 0x02, 0x04, 0x26, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xda, 0x02, 0x6b, 0x00, 0x20, + 0x00, 0x5b, 0x40, 0x39, 0x1d, 0x10, 0x17, 0x20, 0x0b, 0x01, 0x0b, 0x20, 0x06, 0x40, 0x06, 0x50, + 0x06, 0x60, 0x06, 0x04, 0x06, 0x03, 0x40, 0x0a, 0x00, 0x4d, 0x0f, 0x03, 0x3f, 0x03, 0x02, 0x03, + 0x22, 0x09, 0x04, 0x08, 0x44, 0x20, 0x00, 0x01, 0x00, 0x21, 0x13, 0x1a, 0x92, 0x05, 0x48, 0x40, + 0x08, 0x01, 0x08, 0x08, 0x09, 0x03, 0x48, 0x01, 0x02, 0x09, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x32, + 0x10, 0xc6, 0x5d, 0x2b, 0xc6, 0x5d, 0xd6, 0x5d, 0xd6, 0xdc, 0xc5, 0x31, 0x30, 0x33, 0x11, 0x21, + 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x3f, 0x01, 0x77, 0xfc, + 0xdb, 0xdb, 0x01, 0x12, 0x0a, 0x17, 0x13, 0x0d, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, 0x33, + 0x1c, 0x30, 0x2a, 0x21, 0x1d, 0x02, 0x6b, 0x66, 0x8b, 0x66, 0xae, 0x66, 0x08, 0x14, 0x16, 0x16, + 0x09, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, 0x25, 0x1b, 0x1a, 0x3a, 0x16, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1f, 0xff, 0x56, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x2e, 0x00, 0x39, 0x00, 0x73, + 0xb9, 0x00, 0x2e, 0xff, 0xc0, 0xb4, 0x09, 0x0d, 0x00, 0x4c, 0x21, 0xb8, 0xff, 0xc0, 0x40, 0x3e, + 0x19, 0x1a, 0x00, 0x4c, 0x2f, 0x53, 0x22, 0x00, 0x1a, 0x20, 0x1a, 0x40, 0x1a, 0x03, 0x1a, 0x3b, + 0x06, 0x28, 0x00, 0x3b, 0x1b, 0x39, 0x53, 0x70, 0x0f, 0x01, 0x0f, 0x3a, 0x1a, 0x4f, 0x1b, 0x5f, + 0x1b, 0x6f, 0x1b, 0x03, 0x1b, 0x55, 0x0f, 0x2f, 0x01, 0x2f, 0x2f, 0x1e, 0x30, 0x34, 0x01, 0x34, + 0x57, 0x14, 0x0b, 0x21, 0x40, 0x1e, 0x01, 0x1e, 0x57, 0x0a, 0x07, 0x2b, 0x03, 0x92, 0x00, 0x3f, + 0xcd, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x5d, 0x32, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0xdc, 0xcd, 0x10, 0xd6, 0x5d, 0xc6, 0xed, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x21, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x17, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x01, 0xad, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1a, 0x17, + 0x06, 0x3c, 0x5f, 0x43, 0x24, 0x26, 0x3e, 0x50, 0x2a, 0x68, 0x6c, 0x01, 0x01, 0xfe, 0xcf, 0x4c, + 0x3c, 0x25, 0x43, 0x17, 0x11, 0x09, 0x08, 0x1b, 0x19, 0x13, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x4c, + 0x0a, 0x16, 0x22, 0x19, 0x18, 0x23, 0x17, 0x0d, 0x02, 0x9c, 0x05, 0x09, 0x25, 0x1b, 0x17, 0x33, + 0x15, 0x1f, 0x3d, 0x5a, 0x3c, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, 0x76, 0x0c, 0x1a, 0x08, 0x2e, 0x35, + 0x10, 0x08, 0x67, 0x06, 0x05, 0x16, 0x1a, 0x1c, 0x0b, 0x0a, 0x0e, 0x02, 0x05, 0x01, 0x7a, 0x13, + 0x23, 0x1c, 0x11, 0x10, 0x1c, 0x24, 0x13, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf6, 0x40, 0x09, 0x0c, 0x10, 0x00, 0x0a, 0x50, 0x01, 0x01, + 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x03, 0x26, 0x2a, 0x00, 0x07, 0x50, 0x02, 0x04, 0x2b, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x69, 0x00, 0x2d, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x32, 0x28, 0x24, + 0x15, 0x20, 0x50, 0x01, 0x1a, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, + 0xff, 0x58, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0f, 0x2c, 0x28, 0x21, 0x0c, 0x50, 0x02, 0x24, 0x29, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x35, 0x02, 0x26, + 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x2d, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x31, 0x28, 0x32, 0x15, 0x20, 0x50, 0x01, 0x1a, 0x24, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xaa, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0e, 0x2c, 0x36, 0x21, 0x0c, + 0x50, 0x02, 0x24, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, 0x00, 0x2d, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x31, 0x26, 0x2c, 0x15, 0x20, 0x50, 0x01, 0x1a, 0x24, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xa3, 0x02, 0x26, + 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0e, + 0x2a, 0x30, 0x21, 0x0c, 0x50, 0x02, 0x24, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0x56, 0x01, 0xd0, 0x02, 0x79, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, + 0x00, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x04, 0x2d, 0x26, 0x15, 0x20, 0x50, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xc4, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc4, 0x24, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x2f, 0x2a, 0x2d, 0x21, 0x0c, + 0x50, 0x02, 0x24, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x10, 0x0c, 0x06, 0x00, 0x50, 0x01, 0x00, 0x0d, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x01, 0xb9, 0x03, 0x3d, 0x00, 0x15, + 0x00, 0x1b, 0x00, 0x48, 0xb9, 0x00, 0x16, 0xff, 0xf8, 0x40, 0x0f, 0x12, 0x14, 0x00, 0x4c, 0x0e, + 0x51, 0x0b, 0x1d, 0x16, 0x1a, 0x1c, 0x03, 0x14, 0x51, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, + 0x0c, 0x48, 0x00, 0x1c, 0x19, 0x17, 0x18, 0x1b, 0x86, 0x15, 0x06, 0x0d, 0x06, 0x11, 0x57, 0x06, + 0x0b, 0x02, 0x07, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xd5, 0xcd, 0xcd, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x37, 0x15, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x11, 0x13, 0x07, 0x27, 0x07, 0x27, 0x37, 0x3f, 0x7b, 0x0f, 0x2a, 0x10, 0x34, 0x46, 0x2a, 0x12, + 0x7b, 0x1e, 0x2a, 0x11, 0x21, 0x0a, 0x83, 0x26, 0x5c, 0x5e, 0x26, 0x84, 0x02, 0x79, 0x15, 0xbc, + 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0x02, + 0xde, 0x39, 0x36, 0x36, 0x39, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe3, + 0x02, 0x6b, 0x00, 0x13, 0x00, 0x17, 0x00, 0x63, 0x40, 0x3d, 0x04, 0x02, 0x20, 0x01, 0x30, 0x01, + 0x02, 0x01, 0x44, 0x15, 0x14, 0x07, 0x20, 0x12, 0x40, 0x12, 0x50, 0x12, 0x03, 0x12, 0x44, 0x17, + 0x16, 0x08, 0x20, 0x11, 0x30, 0x11, 0x02, 0x11, 0x44, 0x0f, 0x0a, 0x0f, 0x0c, 0x2f, 0x0c, 0x02, + 0xbf, 0x0c, 0x01, 0x0c, 0x18, 0x07, 0x48, 0x14, 0x0b, 0x04, 0x15, 0x48, 0x0e, 0x01, 0x12, 0x13, + 0x02, 0x10, 0x02, 0x09, 0x08, 0x06, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xd5, 0x32, 0x32, 0xfd, + 0x32, 0x32, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xce, 0xdc, 0xfd, 0x5d, 0x32, 0x32, 0x32, + 0xfe, 0x5d, 0x32, 0x32, 0x32, 0xfd, 0x5d, 0xcd, 0x33, 0x31, 0x30, 0x01, 0x15, 0x33, 0x15, 0x23, + 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x11, + 0x35, 0x23, 0x15, 0x01, 0xb6, 0x2d, 0x2d, 0x7c, 0x80, 0x7b, 0x2d, 0x2d, 0x7b, 0x80, 0x80, 0x02, + 0x6b, 0x48, 0x63, 0xfe, 0x40, 0xfe, 0xfe, 0x01, 0xc0, 0x63, 0x48, 0x48, 0x48, 0xfe, 0xf8, 0x5d, + 0x5d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb6, 0x00, 0x1d, + 0x00, 0xb2, 0xb5, 0x06, 0x40, 0x09, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x14, 0x00, + 0x4d, 0x0a, 0x40, 0x10, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x09, 0xb8, + 0xff, 0xc0, 0x40, 0x09, 0x14, 0x00, 0x4d, 0x09, 0x40, 0x10, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xc0, + 0xb3, 0x16, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x3b, 0x14, 0x00, 0x4d, 0x02, 0x48, 0x10, + 0x00, 0x4d, 0x16, 0x51, 0x08, 0xa0, 0x13, 0x01, 0x2f, 0x13, 0x3f, 0x13, 0x02, 0x13, 0x1f, 0x0b, + 0x0a, 0x07, 0x1c, 0x51, 0x04, 0xa0, 0x00, 0x01, 0x00, 0x05, 0x02, 0x1e, 0x07, 0x04, 0x01, 0x0a, + 0x0a, 0x01, 0x04, 0x07, 0x04, 0x06, 0x1d, 0x06, 0x15, 0x06, 0x19, 0x57, 0x30, 0x0e, 0x01, 0x0e, + 0x0b, 0x06, 0x01, 0x05, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x5d, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xc6, 0xc4, 0xd6, 0x5d, 0x32, 0xed, 0x32, 0x32, 0x32, 0x10, + 0xd6, 0x5d, 0x5d, 0xc4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x11, 0x50, 0x37, 0x37, 0x7c, 0x7f, 0x7f, 0x0e, 0x26, 0x0f, 0x31, 0x41, 0x27, 0x11, 0x7b, 0x1a, + 0x23, 0x0e, 0x1f, 0x08, 0x02, 0x14, 0x53, 0x3a, 0x15, 0x4f, 0x53, 0x42, 0x05, 0x09, 0x1f, 0x39, + 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0x00, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2b, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x1a, 0x0c, 0x00, 0x06, 0x50, 0x01, + 0x05, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xa0, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0xed, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xee, 0x40, 0x09, 0x22, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x21, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x12, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x0c, 0x0d, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0x87, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0xed, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xee, 0x40, 0x09, 0x14, + 0x15, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xbf, 0x03, 0x35, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x10, 0x1a, 0x00, 0x06, 0x50, 0x01, + 0x05, 0x0c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xaa, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0xef, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xee, 0x40, 0x09, 0x18, 0x22, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x14, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x01, 0x00, 0x36, 0xff, 0x56, 0x01, 0xbf, 0x02, 0x6b, 0x00, 0x21, + 0x00, 0x59, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x12, 0xb8, 0xff, 0xc0, + 0x40, 0x2d, 0x09, 0x0a, 0x00, 0x4c, 0x06, 0x1b, 0x00, 0x23, 0x14, 0x10, 0x0f, 0x13, 0x1f, 0x13, + 0x02, 0x13, 0x44, 0x0d, 0x0b, 0x10, 0x0f, 0x30, 0x0f, 0x40, 0x0f, 0x50, 0x0f, 0x04, 0x0f, 0x22, + 0x0c, 0x13, 0x48, 0x15, 0x08, 0x0d, 0x12, 0x48, 0x10, 0x02, 0x0a, 0x08, 0x21, 0x03, 0x92, 0x00, + 0x3f, 0xc5, 0x3f, 0x3f, 0xfd, 0xc0, 0x3f, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0x32, 0xd5, 0xfd, + 0x5d, 0xc4, 0xc5, 0x10, 0xd6, 0xdc, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x05, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, + 0x15, 0x23, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x4e, 0x0e, 0x33, 0x1c, + 0x30, 0x2a, 0x21, 0x1d, 0x9f, 0x87, 0x87, 0x01, 0x89, 0x86, 0x86, 0x80, 0x0a, 0x16, 0x13, 0x0d, + 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x9c, 0x05, 0x09, 0x25, 0x1b, 0x1a, 0x3a, 0x16, 0x66, 0x01, 0x9f, + 0x66, 0x66, 0xfe, 0x61, 0x66, 0x08, 0x14, 0x16, 0x16, 0x09, 0x0a, 0x0e, 0x02, 0x05, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd3, 0x02, 0xac, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x52, + 0xb9, 0x00, 0x33, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x32, 0xb8, 0xff, 0xc0, 0x40, 0x26, 0x0d, + 0x00, 0x4d, 0x1f, 0x11, 0x18, 0x33, 0x35, 0x00, 0x35, 0x20, 0x35, 0x02, 0x2b, 0x51, 0x28, 0x2a, + 0x00, 0x54, 0x06, 0x2a, 0x34, 0x32, 0x2f, 0x55, 0x0c, 0x22, 0x07, 0x17, 0x1a, 0x92, 0x29, 0x55, + 0x2b, 0x03, 0x58, 0x09, 0x00, 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x3f, 0xcd, 0x3f, 0xc5, 0xfd, 0xc6, + 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xd5, 0xed, 0x5d, 0x10, 0xc6, 0xd6, 0xdc, 0xc5, 0x31, 0x30, + 0x2b, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x0e, + 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x2e, 0x03, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x17, 0x01, 0x1c, 0x2e, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x9f, 0x0a, 0x17, 0x13, 0x0c, + 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x27, 0x2c, 0x14, 0x24, 0x1b, 0x11, 0x1a, 0x17, 0x2d, 0x3d, + 0x24, 0x10, 0x82, 0xfd, 0x1f, 0x24, 0x11, 0x30, 0x1e, 0x10, 0x02, 0x5d, 0x24, 0x2a, 0x2a, 0x24, + 0x25, 0x2a, 0x2a, 0xfd, 0x7e, 0x08, 0x14, 0x16, 0x16, 0x09, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x0e, + 0x07, 0x0f, 0x19, 0x11, 0x17, 0x33, 0x15, 0x02, 0x1d, 0x35, 0x4b, 0x2f, 0xad, 0x66, 0xfe, 0xdc, + 0x2b, 0x27, 0x09, 0x0e, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, 0x00, 0x00, 0x00, 0x9a, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x0e, 0x14, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0c, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x01, 0xd6, 0x00, 0x13, + 0x00, 0x3b, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x1a, 0x0a, 0x00, 0x4d, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x03, 0x00, 0x15, 0x0d, 0x51, 0x09, + 0x0a, 0x14, 0x09, 0x55, 0x0c, 0x0a, 0x13, 0x10, 0x57, 0x03, 0x07, 0x00, 0x3f, 0xfd, 0xce, 0x3f, + 0xed, 0x01, 0x10, 0xd6, 0xdd, 0xed, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x25, 0x06, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x01, 0xd3, 0x26, 0x43, 0x1c, 0x30, 0x41, 0x27, 0x10, 0x82, 0xfd, 0x1f, 0x24, 0x11, 0x30, 0x1e, + 0x14, 0x12, 0x0d, 0x1c, 0x35, 0x4c, 0x31, 0xad, 0x66, 0xfe, 0xdd, 0x2a, 0x29, 0x09, 0x0e, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xac, 0x02, 0x06, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x18, 0xff, 0xf3, 0x01, 0xe0, 0x02, 0x6b, 0x00, 0x03, 0x00, 0x17, 0x00, 0x3f, + 0x40, 0x0b, 0x2f, 0x15, 0x3f, 0x15, 0x02, 0x15, 0x44, 0x60, 0x04, 0x01, 0x04, 0xb8, 0xff, 0xc0, + 0x40, 0x18, 0x11, 0x15, 0x48, 0x04, 0x19, 0x0c, 0x02, 0x44, 0xc0, 0x01, 0x01, 0x01, 0x18, 0x16, + 0x02, 0x0d, 0x10, 0x4a, 0x09, 0x09, 0x03, 0x08, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xc2, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xce, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x33, + 0x11, 0x33, 0x11, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x11, 0x33, 0x18, 0x7b, 0x01, 0x4d, 0x1b, 0x30, 0x3f, 0x24, 0x23, 0x3e, 0x24, + 0x30, 0x0f, 0x21, 0x1a, 0x0d, 0x17, 0x10, 0x09, 0x7c, 0x02, 0x6b, 0xfd, 0x95, 0xc2, 0x3e, 0x50, + 0x2e, 0x13, 0x11, 0x19, 0x62, 0x0e, 0x13, 0x08, 0x17, 0x2a, 0x23, 0x01, 0xa1, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x37, 0xff, 0x5b, 0x01, 0xbb, 0x02, 0xac, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1f, + 0x00, 0x2b, 0x00, 0x89, 0xb9, 0x00, 0x03, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x00, 0xb8, 0xff, + 0xc0, 0x40, 0x1d, 0x0e, 0x00, 0x4d, 0x26, 0x54, 0xa0, 0x20, 0xb0, 0x20, 0x02, 0x02, 0x80, 0x20, + 0x90, 0x20, 0x02, 0x3f, 0x20, 0x01, 0x20, 0x2d, 0x04, 0x54, 0xcf, 0x0a, 0xdf, 0x0a, 0x02, 0x0a, + 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x0e, 0x48, 0x0a, 0x2c, 0x1c, 0x51, 0x3f, 0x1b, 0x4f, 0x1b, + 0x02, 0x1b, 0x5f, 0x03, 0x01, 0x03, 0x51, 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x0b, 0x0e, 0x48, + 0x02, 0xb0, 0x13, 0x01, 0x13, 0x2c, 0x1b, 0x23, 0x58, 0x29, 0x00, 0x14, 0x17, 0x57, 0x10, 0x0e, + 0x03, 0x07, 0x58, 0x0d, 0x00, 0x01, 0x06, 0x00, 0x3f, 0x3f, 0xfd, 0xce, 0x3f, 0xfd, 0xc6, 0x3f, + 0xfd, 0xce, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x2b, 0xfd, 0x5d, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x2b, + 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0x5d, 0x5f, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x33, 0x23, 0x11, + 0x33, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x13, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xc4, 0x7b, 0x7b, 0x12, 0x30, 0x20, 0x20, + 0x2f, 0x2f, 0x20, 0x20, 0x30, 0x2d, 0x0d, 0x31, 0x15, 0x11, 0x0e, 0x16, 0x11, 0x20, 0x18, 0x7c, + 0x51, 0x62, 0x30, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x30, 0x01, 0xd6, 0x87, 0x25, 0x29, 0x29, + 0x25, 0x26, 0x29, 0x29, 0xfc, 0xd8, 0x04, 0x08, 0x65, 0x05, 0x03, 0x26, 0x23, 0x01, 0xc9, 0xfe, + 0x3b, 0x5e, 0x58, 0x03, 0x02, 0x25, 0x29, 0x29, 0x25, 0x26, 0x29, 0x29, 0xff, 0xff, 0x00, 0x2a, + 0xff, 0xf3, 0x01, 0xbc, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, + 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x41, 0x18, 0x14, 0x08, 0x00, 0x50, 0x01, + 0x12, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xff, 0x56, 0x01, 0x98, + 0x02, 0xb3, 0x02, 0x26, 0x01, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x2c, 0x18, 0x14, 0x08, 0x00, 0x50, 0x01, 0x12, 0x15, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x2d, 0xff, 0x56, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xef, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xde, 0xb4, 0x24, 0x1d, + 0x07, 0x1a, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xe7, + 0x02, 0xb6, 0x02, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0xef, 0x00, 0x00, 0x0d, + 0xb9, 0x00, 0x01, 0xff, 0xd6, 0xb4, 0x24, 0x1d, 0x18, 0x10, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x14, 0x02, 0xb3, 0x00, 0x1a, 0x00, 0x2a, 0x00, 0x65, + 0x40, 0x0c, 0x00, 0x61, 0x1a, 0x2c, 0x24, 0x1b, 0x40, 0x10, 0x01, 0x10, 0x2c, 0x2c, 0xb8, 0xff, + 0xc0, 0x40, 0x11, 0x0b, 0x0e, 0x48, 0x09, 0x0a, 0x0a, 0x15, 0x15, 0x05, 0x20, 0x06, 0x30, 0x06, + 0x02, 0x06, 0x51, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x0b, 0x0e, 0x48, 0x07, 0x2b, 0x2a, 0x23, + 0x9f, 0x0f, 0x02, 0x15, 0x0a, 0x05, 0x0a, 0x05, 0x0a, 0x06, 0x08, 0x02, 0x06, 0x08, 0x00, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x3f, 0x3f, 0xc4, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0x5d, 0x32, 0x32, 0x2f, 0x32, 0x2f, 0x33, 0x2b, 0x10, 0xd4, 0x5d, 0xd4, 0xc5, + 0x10, 0xd6, 0xed, 0x31, 0x30, 0x21, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x03, + 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x03, 0x26, 0x26, 0x37, 0x3e, 0x03, 0x37, 0x17, + 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x01, 0x20, 0x08, 0x1d, 0x24, 0x26, 0x12, 0x72, 0x72, 0x0f, + 0x20, 0x1c, 0x18, 0x08, 0x82, 0x0a, 0x20, 0x2a, 0x33, 0x1c, 0x24, 0x3a, 0x2d, 0x22, 0x0c, 0x0f, + 0x02, 0x02, 0x01, 0x02, 0x0a, 0x0f, 0x16, 0x0e, 0x45, 0x13, 0x0f, 0x01, 0x02, 0x23, 0x51, 0x4d, + 0x43, 0x17, 0xfe, 0xe5, 0x02, 0x6b, 0xfe, 0xff, 0x1c, 0x44, 0x44, 0x42, 0x1b, 0x1b, 0x44, 0x4b, + 0x50, 0x27, 0x22, 0x53, 0x58, 0x58, 0x25, 0x01, 0xba, 0x0e, 0x1d, 0x0d, 0x21, 0x34, 0x2c, 0x29, + 0x17, 0x10, 0x31, 0x59, 0x2f, 0x0d, 0x1a, 0x09, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, + 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x27, 0x40, 0x14, 0x10, 0x1c, 0x16, 0x1a, 0x51, 0x19, 0x1b, 0x16, + 0x0b, 0x00, 0x03, 0x17, 0x1a, 0x0a, 0x17, 0x06, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xed, 0x32, 0x10, 0xc6, 0x31, 0x30, 0x13, 0x3e, 0x03, + 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x37, + 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, 0x38, 0x2f, + 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x7c, 0x01, 0x1c, 0x15, 0x2f, 0x32, 0x2f, 0x15, + 0x17, 0x36, 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, + 0x01, 0xd5, 0x01, 0x00, 0xff, 0xff, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2f, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xcb, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xc7, 0x40, 0x09, 0x08, 0x06, 0x01, 0x00, 0x50, 0x01, 0x02, 0x07, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x3d, 0x00, 0x13, + 0x00, 0x17, 0x00, 0x39, 0x40, 0x20, 0x3f, 0x00, 0x01, 0x00, 0x19, 0x14, 0x50, 0x16, 0x01, 0x16, + 0x18, 0x0d, 0x53, 0xaf, 0x09, 0x01, 0x09, 0x50, 0x0a, 0x01, 0x0a, 0x18, 0x15, 0x17, 0x86, 0x0b, + 0x9e, 0x13, 0x10, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, + 0x5d, 0xd5, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0xc5, 0x10, 0xce, 0x5d, 0x31, 0x30, 0x25, 0x0e, 0x03, + 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, + 0x07, 0x27, 0x37, 0x01, 0xd3, 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x82, 0xfd, 0x26, 0x1d, + 0x25, 0x32, 0x08, 0x63, 0xc3, 0x1b, 0xbe, 0x14, 0x02, 0x0a, 0x0b, 0x08, 0x65, 0x61, 0x01, 0x64, + 0x66, 0xfe, 0x2d, 0x30, 0x22, 0x14, 0x03, 0x02, 0x6c, 0x3e, 0x3e, 0x5a, 0xff, 0xff, 0x00, 0x47, + 0xff, 0x56, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, + 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xf1, 0xb4, 0x0f, 0x08, 0x01, 0x00, 0x50, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd3, 0x02, 0xb0, 0x02, 0x26, + 0x00, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0x2d, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x2b, 0x1d, + 0x16, 0x0a, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6d, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc2, 0x59, 0xb8, 0x00, 0x0a, + 0xb6, 0x01, 0x4a, 0x08, 0x06, 0x01, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xdd, 0x02, 0xb5, 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x01, 0xc2, + 0x00, 0xac, 0x00, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0xab, 0x16, 0x14, 0x0a, 0x00, 0x50, 0x2b, 0x34, + 0x00, 0x02, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x46, + 0xb2, 0x06, 0x54, 0x00, 0xb8, 0xff, 0xc0, 0xb6, 0x09, 0x0d, 0x48, 0x00, 0x00, 0x12, 0x11, 0xb8, + 0xff, 0xc0, 0x40, 0x1b, 0x09, 0x0d, 0x48, 0x11, 0x13, 0x10, 0x44, 0x20, 0x0e, 0x30, 0x0e, 0x40, + 0x0e, 0x03, 0x0e, 0x12, 0x03, 0x58, 0x09, 0x09, 0x0d, 0x0f, 0x02, 0x10, 0x48, 0x0d, 0x08, 0x00, + 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xc6, 0x2b, 0x12, + 0x39, 0x2f, 0x2b, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x13, 0x21, 0x11, 0x33, 0x11, 0x21, 0x01, 0xca, 0x33, 0x20, 0x20, 0x33, 0x33, 0x20, + 0x20, 0x33, 0x02, 0xfe, 0x7b, 0x7c, 0x01, 0x09, 0x01, 0x68, 0x28, 0x2a, 0x2a, 0x28, 0x28, 0x2a, + 0x2a, 0xfe, 0x70, 0x02, 0x6b, 0xfd, 0xfb, 0x00, 0x00, 0x02, 0x00, 0x24, 0xff, 0xf5, 0x02, 0x38, + 0x02, 0xb5, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x4e, 0x40, 0x30, 0x00, 0x54, 0x40, 0x06, 0x50, 0x06, + 0x02, 0x06, 0x06, 0x20, 0x40, 0x0c, 0x50, 0x0c, 0x02, 0x0c, 0x21, 0x19, 0x51, 0x15, 0x40, 0x09, + 0x0a, 0x00, 0x4c, 0x2f, 0x15, 0x01, 0x15, 0x50, 0x16, 0x01, 0x16, 0x20, 0x03, 0x58, 0x09, 0x09, + 0x11, 0x16, 0x55, 0x17, 0x00, 0x1f, 0x1c, 0x57, 0x11, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xdd, 0x5d, 0x2b, 0xed, 0x10, 0xc6, 0x5d, 0x12, + 0x39, 0x2f, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x03, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x02, 0x38, 0x33, 0x20, 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x65, 0x03, + 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x82, 0xfd, 0x26, 0x1d, 0x25, 0x32, 0x08, 0x01, 0x70, 0x28, + 0x2a, 0x2a, 0x28, 0x28, 0x2a, 0x2a, 0xfe, 0x7c, 0x02, 0x0a, 0x0b, 0x08, 0x65, 0x61, 0x01, 0x94, + 0x66, 0xfd, 0xfd, 0x30, 0x22, 0x14, 0x03, 0x00, 0x00, 0x01, 0xff, 0xf6, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6b, 0x00, 0x0d, 0x00, 0x43, 0x40, 0x25, 0x00, 0x02, 0x10, 0x02, 0x02, 0x02, 0x0f, 0x00, + 0x0a, 0x44, 0x05, 0x09, 0x07, 0x0e, 0x08, 0x0d, 0x0b, 0x03, 0x0c, 0x06, 0x05, 0x00, 0x03, 0x07, + 0x0c, 0x07, 0x0c, 0x07, 0x03, 0x09, 0x02, 0x04, 0x08, 0x02, 0x48, 0x03, 0x08, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x17, 0x39, 0x12, 0x17, 0x39, 0x01, 0x10, 0xc6, + 0xd4, 0x32, 0xed, 0x32, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x13, 0x15, 0x33, 0x15, 0x21, 0x35, 0x07, + 0x27, 0x37, 0x11, 0x33, 0x15, 0x37, 0x17, 0xd5, 0xf7, 0xfe, 0x8d, 0x37, 0x2c, 0x63, 0x7c, 0x6c, + 0x2b, 0x01, 0x24, 0xbe, 0x66, 0xe6, 0x1b, 0x5a, 0x32, 0x01, 0x14, 0xd6, 0x36, 0x5a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb0, 0x00, 0x1b, 0x00, 0x3e, 0x40, 0x25, + 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1d, 0x14, 0x11, 0x51, 0x09, 0x0d, 0x51, 0xc0, 0x0e, 0xd0, + 0x0e, 0x02, 0x0e, 0x1c, 0x12, 0x13, 0x0b, 0x0a, 0x04, 0x05, 0x0d, 0x55, 0x10, 0x10, 0x0f, 0x10, + 0x1b, 0x18, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x01, + 0x10, 0xd6, 0x5d, 0xfd, 0x32, 0xed, 0x32, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x25, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x35, 0x35, 0x07, 0x27, 0x37, 0x35, 0x23, 0x35, 0x33, 0x15, 0x37, 0x17, 0x07, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd3, 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x37, + 0x28, 0x5f, 0x82, 0xfd, 0x40, 0x28, 0x68, 0x26, 0x1d, 0x25, 0x32, 0x08, 0x14, 0x02, 0x0a, 0x0b, + 0x08, 0x65, 0x61, 0x70, 0x1c, 0x53, 0x2f, 0xb9, 0x66, 0xe2, 0x20, 0x52, 0x34, 0xb6, 0x30, 0x22, + 0x14, 0x03, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x0b, 0x12, 0x10, 0x05, 0x0e, 0x50, 0x01, 0x06, 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0xf8, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x16, 0x14, 0x00, 0x07, + 0x50, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, 0xff, 0x56, 0x01, 0xc6, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0xef, 0x00, 0x00, 0x0d, + 0xb9, 0x00, 0x01, 0xff, 0xef, 0xb4, 0x19, 0x12, 0x05, 0x0e, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, 0x01, 0xe0, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xe6, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xe4, 0xb4, 0x1d, 0x16, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x10, 0x14, 0x05, 0x0e, 0x50, 0x01, 0x06, 0x15, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xff, 0x40, 0x09, 0x14, 0x18, 0x00, 0x07, 0x50, 0x01, 0x02, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xc6, 0x02, 0xb5, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x8f, + 0x40, 0x0d, 0x11, 0x40, 0x0f, 0x10, 0x00, 0x4c, 0x10, 0x40, 0x0f, 0x10, 0x00, 0x4c, 0x00, 0xb8, + 0xff, 0xc0, 0x40, 0x11, 0x12, 0x00, 0x4d, 0x20, 0x0f, 0x30, 0x0f, 0x40, 0x0f, 0x03, 0x80, 0x0f, + 0x01, 0x0f, 0x8f, 0x10, 0x00, 0xb8, 0xff, 0xe8, 0x40, 0x43, 0x11, 0x00, 0x4d, 0x00, 0x9f, 0x11, + 0xbf, 0x11, 0x02, 0x11, 0x40, 0x0b, 0x0e, 0x48, 0x11, 0x21, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, + 0x03, 0x6f, 0x06, 0x7f, 0x06, 0x8f, 0x06, 0x03, 0x06, 0x8f, 0x60, 0x07, 0x70, 0x07, 0x80, 0x07, + 0x03, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x4f, 0x07, 0x5f, 0x07, 0x05, 0x07, 0x12, 0x19, 0x20, + 0x18, 0x1f, 0x9f, 0x0e, 0x05, 0x0f, 0x02, 0x09, 0x02, 0x07, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, + 0x3f, 0x3f, 0x39, 0x39, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0x5d, 0x5d, 0xed, 0x5d, 0x71, + 0x10, 0xd6, 0x2b, 0x5d, 0xc5, 0x2b, 0xd0, 0xed, 0x5d, 0x71, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x21, + 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, 0x33, 0x11, 0x01, 0x15, 0x0e, + 0x03, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x01, 0x7b, 0x11, 0x1e, 0x1c, 0x1e, 0x10, + 0x57, 0x4b, 0x0d, 0x1e, 0x1f, 0x20, 0x0e, 0x58, 0xfe, 0xc4, 0x02, 0x09, 0x0f, 0x15, 0x0d, 0x45, + 0x13, 0x0f, 0x01, 0x02, 0x34, 0x5f, 0x5d, 0x62, 0x37, 0xfe, 0x77, 0x02, 0x6b, 0x27, 0x5a, 0x5e, + 0x5f, 0x2d, 0x01, 0x6b, 0xfd, 0x95, 0x02, 0xb5, 0x26, 0x1c, 0x2e, 0x28, 0x25, 0x14, 0x14, 0x28, + 0x47, 0x26, 0x0b, 0x15, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x01, 0xcb, + 0x02, 0xb5, 0x02, 0x26, 0x00, 0x51, 0x12, 0x00, 0x01, 0x07, 0x01, 0x5e, 0xff, 0x36, 0x00, 0x00, + 0x00, 0x06, 0xb3, 0x01, 0x03, 0x1c, 0x4f, 0x2b, 0x00, 0x01, 0x00, 0x2e, 0xff, 0x59, 0x01, 0xc6, + 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x46, 0xb9, 0x00, 0x00, 0xff, 0xe0, 0x40, 0x0f, 0x0e, 0x00, 0x4d, + 0x2f, 0x0c, 0x3f, 0x0c, 0x02, 0x0c, 0x44, 0x0e, 0x1d, 0x03, 0x44, 0x06, 0xb8, 0xff, 0xc0, 0x40, + 0x14, 0x0b, 0x0e, 0x48, 0x06, 0x15, 0x1c, 0x16, 0x18, 0x48, 0x12, 0x92, 0x03, 0x0c, 0x04, 0x0d, + 0x02, 0x07, 0x02, 0x04, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xc6, 0xd6, 0x2b, 0xed, 0x10, 0xde, 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x25, 0x26, 0x26, 0x27, + 0x11, 0x23, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x57, 0x28, 0x5d, 0x35, 0x6f, 0x63, 0x1c, 0x38, 0x35, + 0x2d, 0x10, 0x6f, 0x47, 0x4e, 0x0b, 0x24, 0x12, 0x12, 0x13, 0x12, 0x1c, 0x14, 0x1e, 0x5f, 0xbe, + 0x60, 0xfe, 0x65, 0x02, 0x6b, 0x2c, 0x67, 0x66, 0x60, 0x24, 0x01, 0x7d, 0xfd, 0x9d, 0x57, 0x58, + 0x04, 0x08, 0x65, 0x08, 0x22, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x01, 0xe0, 0x00, 0x1d, 0x00, 0x35, 0x40, 0x0b, 0x00, 0x51, 0x11, 0x1f, 0x0f, 0x18, 0x01, 0x18, + 0x07, 0x51, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x09, 0x0c, 0x48, 0x08, 0x1e, 0x19, 0x1b, 0x57, + 0x15, 0x0e, 0x03, 0x57, 0x0c, 0x0b, 0x07, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xd6, 0x2b, 0xed, 0xc6, 0x5d, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x25, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x11, 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x01, 0x3e, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, + 0x21, 0x61, 0x39, 0x38, 0x4a, 0x2b, 0x12, 0x49, 0x54, 0x0b, 0x29, 0x13, 0x10, 0x13, 0x15, 0x31, + 0xf9, 0x42, 0x3a, 0x02, 0x02, 0xfe, 0x8f, 0x01, 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, + 0xfa, 0x56, 0x52, 0x03, 0x08, 0x5f, 0x06, 0x3f, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x12, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x20, 0x21, 0x14, 0x19, 0x50, 0x02, 0x16, 0x22, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0xff, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, + 0x20, 0x21, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x35, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x24, 0x2e, 0x14, 0x19, 0x50, 0x02, + 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xaa, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x24, 0x2e, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xda, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x65, 0x00, 0x24, 0x00, 0x8a, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x26, 0x22, + 0x24, 0x14, 0x19, 0x50, 0x03, 0x16, 0x25, 0x4f, 0x02, 0x16, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xda, 0x02, 0xb4, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x65, 0x24, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, + 0x26, 0x22, 0x24, 0x09, 0x00, 0x50, 0x03, 0x0e, 0x25, 0x4f, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x02, 0xff, 0xea, 0x40, 0x09, 0x27, 0x25, 0x14, 0x0d, 0x50, 0x02, 0x00, 0x26, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0x00, 0x00, 0x01, 0xcb, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x1b, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0e, + 0x16, 0x14, 0x0a, 0x13, 0x50, 0x01, 0x0d, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x36, + 0xff, 0x56, 0x01, 0xe9, 0x02, 0x72, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, + 0xef, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0xda, 0xb4, 0x2e, 0x27, 0x14, 0x0d, 0x50, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0xff, 0x56, 0x01, 0xcb, 0x01, 0xdf, 0x02, 0x26, + 0x00, 0x55, 0x00, 0x00, 0x01, 0x07, 0x01, 0xc3, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, + 0x01, 0xff, 0x67, 0xb4, 0x1d, 0x16, 0x0a, 0x13, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0xff, 0xef, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xdb, 0x40, 0x09, 0x25, 0x29, 0x14, + 0x0d, 0x50, 0x02, 0x00, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, + 0x00, 0x00, 0x01, 0xcb, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x24, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0d, 0x14, 0x18, 0x0a, 0x13, 0x50, 0x01, 0x0d, 0x19, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xfd, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x08, 0x31, 0x2f, 0x2b, 0x24, 0x50, 0x01, 0x11, 0x30, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0xfd, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0a, 0x34, 0x32, 0x2e, 0x25, + 0x50, 0x01, 0x11, 0x33, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x33, 0x2f, 0x2b, 0x24, 0x50, 0x01, 0x11, 0x30, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x36, 0x32, 0x2e, 0x25, 0x50, 0x01, 0x11, 0x33, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x28, + 0xff, 0x56, 0x01, 0xcc, 0x02, 0x79, 0x00, 0x46, 0x00, 0x7e, 0xb9, 0x00, 0x40, 0xff, 0xe0, 0xb4, + 0x0e, 0x0f, 0x00, 0x4c, 0x3b, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x0d, 0x00, 0x4d, 0x33, 0x40, 0x0d, + 0x00, 0x4d, 0x29, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x0b, + 0x0d, 0x00, 0x4d, 0x22, 0x46, 0x42, 0x32, 0x48, 0x38, 0x46, 0x2c, 0xb8, 0xff, 0xc0, 0x40, 0x22, + 0x0b, 0x0e, 0x48, 0x2c, 0x47, 0x03, 0x10, 0x0a, 0x40, 0x19, 0x50, 0x19, 0x02, 0x19, 0x47, 0x33, + 0x36, 0x4a, 0x2f, 0x3d, 0x4a, 0x27, 0x27, 0x16, 0x2f, 0x03, 0x1a, 0x1d, 0x4a, 0x16, 0x09, 0x0e, + 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xfd, 0xce, 0x3f, 0x12, 0x39, 0x10, 0xed, 0x10, 0xfd, 0xce, + 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0xdc, 0xcd, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xce, 0xde, 0xed, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, 0x26, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x1e, 0x02, 0x17, + 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, 0x06, 0x01, 0x04, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, + 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x02, 0x07, 0x03, 0x38, 0x45, 0x14, 0x24, 0x1b, + 0x4b, 0x36, 0x1f, 0x29, 0x18, 0x09, 0x16, 0x22, 0x2a, 0x15, 0x1c, 0x3c, 0x31, 0x20, 0x71, 0x63, + 0x39, 0x55, 0x1d, 0x24, 0x19, 0x3d, 0x28, 0x62, 0x14, 0x1f, 0x27, 0x13, 0x1d, 0x3f, 0x35, 0x22, + 0x61, 0x62, 0x04, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, + 0x13, 0x0c, 0x06, 0x08, 0x10, 0x08, 0x05, 0x1c, 0x0c, 0x64, 0x10, 0x1c, 0x0d, 0x17, 0x1d, 0x0f, + 0x13, 0x1e, 0x17, 0x13, 0x08, 0x0a, 0x1a, 0x28, 0x3b, 0x2c, 0x57, 0x62, 0x1a, 0x10, 0x5f, 0x0e, + 0x14, 0x47, 0x12, 0x1b, 0x15, 0x10, 0x07, 0x0b, 0x1b, 0x2d, 0x43, 0x33, 0x51, 0x5d, 0x07, 0x08, + 0x00, 0x01, 0x00, 0x36, 0xff, 0x56, 0x01, 0xba, 0x01, 0xe2, 0x00, 0x48, 0x00, 0xa1, 0x40, 0x0d, + 0x34, 0x20, 0x0e, 0x0f, 0x00, 0x4c, 0x33, 0x40, 0x0e, 0x0f, 0x00, 0x4c, 0x1a, 0xb8, 0xff, 0xe0, + 0xb3, 0x10, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0e, 0x0f, 0x00, 0x4c, 0x32, 0x20, + 0x53, 0x20, 0x43, 0x40, 0x43, 0x50, 0x43, 0x60, 0x43, 0x04, 0x43, 0x4a, 0x39, 0x53, 0x2a, 0xb8, + 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x0f, 0x48, 0x2a, 0x49, 0x03, 0x10, 0x0a, 0x19, 0xb8, 0xff, 0xc0, + 0x40, 0x30, 0x0b, 0x0f, 0x48, 0x0f, 0x19, 0x01, 0x19, 0x49, 0x0f, 0x33, 0x1f, 0x33, 0x2f, 0x33, + 0x03, 0x33, 0x4f, 0x36, 0x01, 0x36, 0x57, 0x2f, 0x00, 0x1a, 0x10, 0x1a, 0x20, 0x1a, 0x03, 0x1a, + 0x40, 0x1d, 0x01, 0x1d, 0x57, 0x0e, 0x12, 0x08, 0x25, 0x3e, 0x2f, 0x16, 0x16, 0x08, 0x2f, 0x0b, + 0x08, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0xfd, 0x5d, + 0xce, 0x5d, 0x10, 0xfd, 0x5d, 0xce, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xd6, 0xdc, 0xc5, 0x10, + 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x05, + 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, + 0x27, 0x27, 0x36, 0x36, 0x37, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, + 0x0e, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, + 0x02, 0x07, 0x04, 0x31, 0x47, 0x16, 0x13, 0x23, 0x4f, 0x29, 0x2d, 0x30, 0x0f, 0x1b, 0x23, 0x13, + 0x1b, 0x38, 0x2e, 0x1e, 0x17, 0x31, 0x4c, 0x35, 0x2e, 0x4f, 0x1d, 0x13, 0x11, 0x48, 0x2d, 0x2f, + 0x21, 0x0f, 0x19, 0x21, 0x13, 0x1b, 0x3a, 0x2f, 0x1e, 0x12, 0x27, 0x3f, 0x2e, 0x18, 0x0a, 0x27, + 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x08, 0x11, 0x08, + 0x04, 0x18, 0x0a, 0x67, 0x0e, 0x18, 0x0d, 0x14, 0x0d, 0x12, 0x0d, 0x0c, 0x06, 0x08, 0x15, 0x20, + 0x31, 0x25, 0x1e, 0x35, 0x29, 0x17, 0x0e, 0x0d, 0x68, 0x05, 0x17, 0x17, 0x0d, 0x0b, 0x11, 0x0e, + 0x0d, 0x06, 0x09, 0x16, 0x21, 0x33, 0x25, 0x1a, 0x2f, 0x24, 0x19, 0x04, 0x00, 0x01, 0x00, 0x19, + 0xff, 0x56, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x20, 0x00, 0x50, 0x40, 0x31, 0x13, 0x40, 0x0b, 0x0f, + 0x00, 0x4c, 0x0f, 0x1c, 0x01, 0x1c, 0x1d, 0x44, 0x0f, 0x18, 0x01, 0x18, 0xd0, 0x1a, 0xe0, 0x1a, + 0xf0, 0x1a, 0x03, 0x1a, 0x21, 0xa0, 0x03, 0x01, 0x03, 0x10, 0x2f, 0x0a, 0x01, 0x0a, 0x21, 0x13, + 0x00, 0x08, 0x1e, 0x08, 0x1d, 0x18, 0x48, 0x1a, 0x02, 0x0b, 0x0e, 0x08, 0x12, 0x00, 0x3f, 0xd5, + 0xc6, 0x3f, 0xed, 0x32, 0x3f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x5d, 0xdc, 0xc5, 0x5d, 0x10, + 0xd6, 0x5d, 0xdd, 0x5d, 0xfd, 0xcd, 0x5d, 0x31, 0x30, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, + 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x23, 0x06, 0x01, 0x11, 0x21, 0x1a, 0x15, 0x21, + 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x03, 0x09, 0x05, 0x0f, 0xa3, + 0x01, 0xc2, 0xa3, 0x1d, 0x05, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, + 0x07, 0x19, 0x13, 0x0c, 0x06, 0x0b, 0x17, 0x09, 0x02, 0x05, 0x66, 0x66, 0xfd, 0xfb, 0x08, 0x00, + 0x00, 0x01, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd8, 0x02, 0x60, 0x00, 0x34, 0x00, 0x69, 0xb9, 0x00, + 0x31, 0xff, 0xc0, 0x40, 0x3e, 0x0b, 0x00, 0x4d, 0x00, 0x31, 0x10, 0x31, 0x40, 0x31, 0x60, 0x31, + 0x80, 0x31, 0x05, 0x31, 0x36, 0x3f, 0x23, 0x01, 0x23, 0x90, 0x24, 0x01, 0x24, 0x22, 0x25, 0x51, + 0x1f, 0x1c, 0x50, 0x1d, 0x60, 0x1d, 0x02, 0x1d, 0x35, 0x03, 0x10, 0x10, 0x0a, 0x01, 0x0a, 0x35, + 0x30, 0x2b, 0x57, 0x34, 0x07, 0x1c, 0x25, 0x55, 0x1f, 0x22, 0x0a, 0x20, 0x21, 0x07, 0x16, 0x07, + 0x0e, 0x08, 0x0f, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0xc1, 0x3f, 0x33, 0xed, 0x32, 0x3f, 0xed, 0xc5, + 0x01, 0x10, 0xd6, 0x5d, 0xdc, 0xcd, 0x10, 0xd6, 0x5d, 0xd5, 0x32, 0xfd, 0x32, 0xc5, 0x5d, 0x32, + 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, 0x2e, 0x03, 0x35, + 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x3e, 0x02, 0x37, 0x17, 0x06, 0x06, 0x07, 0x01, 0x57, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, + 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x02, 0x07, 0x04, 0x1e, 0x2f, 0x20, 0x11, 0x6b, + 0x6b, 0x7b, 0xc5, 0xc5, 0x0a, 0x12, 0x1a, 0x10, 0x11, 0x1d, 0x1b, 0x1d, 0x11, 0x11, 0x1c, 0x40, + 0x20, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, + 0x06, 0x09, 0x12, 0x08, 0x03, 0x15, 0x2a, 0x43, 0x32, 0xc1, 0x66, 0x76, 0x14, 0x8a, 0x66, 0xbe, + 0x1a, 0x20, 0x12, 0x06, 0x02, 0x05, 0x0a, 0x08, 0x6a, 0x0b, 0x0c, 0x02, 0xff, 0xff, 0x00, 0x19, + 0x00, 0x00, 0x01, 0xdb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x08, 0x0c, 0x06, 0x00, 0x50, 0x01, + 0x00, 0x0d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd8, + 0x02, 0xb5, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x07, 0x01, 0xc5, 0x00, 0x82, 0x00, 0x00, + 0x00, 0x0a, 0xb6, 0x01, 0x7d, 0x20, 0x1e, 0x01, 0x15, 0x50, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x19, + 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x0d, 0x0b, 0x40, 0x0a, 0x0c, + 0x00, 0x4c, 0x0a, 0x40, 0x0a, 0x0c, 0x00, 0x4c, 0x05, 0xb8, 0xff, 0xc0, 0xb4, 0x0a, 0x0d, 0x00, + 0x4c, 0x04, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x0a, 0x0d, 0x00, 0x4c, 0x11, 0x04, 0x01, 0x02, 0x06, + 0x03, 0x03, 0x02, 0x44, 0x0d, 0x0c, 0x0c, 0x09, 0x0d, 0x0b, 0x0e, 0x10, 0x02, 0x0d, 0x48, 0x0f, + 0x02, 0x09, 0x06, 0x48, 0x0c, 0x03, 0x03, 0x08, 0x08, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x39, 0x2f, + 0x33, 0xed, 0x32, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xc6, 0xc5, 0x32, 0x32, 0x2f, 0x10, 0xed, + 0x32, 0x2f, 0x32, 0x10, 0xd5, 0xc6, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x15, 0x23, + 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x01, 0xdb, 0xa3, + 0x7e, 0x7e, 0x7c, 0x7d, 0x7d, 0xa3, 0x02, 0x6b, 0x66, 0xb4, 0x63, 0xee, 0xee, 0x63, 0xb4, 0x66, + 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd8, 0x02, 0x60, 0x00, 0x25, 0x00, 0x9e, 0xb9, 0x00, + 0x1c, 0xff, 0xc0, 0xb4, 0x19, 0x1a, 0x00, 0x4c, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, + 0x1b, 0xb8, 0xff, 0xc0, 0xb4, 0x19, 0x1a, 0x00, 0x4c, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x14, + 0x00, 0x4d, 0x20, 0x0b, 0x40, 0x0b, 0x60, 0x0b, 0x70, 0x0b, 0x80, 0x0b, 0x05, 0x0b, 0xb8, 0xff, + 0xb8, 0x40, 0x18, 0x0a, 0x49, 0x00, 0x0b, 0x01, 0x0b, 0x27, 0x00, 0x03, 0x03, 0x04, 0x04, 0x0a, + 0x51, 0x50, 0x07, 0x60, 0x07, 0x70, 0x07, 0x03, 0x07, 0x05, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x24, + 0x0e, 0x11, 0x48, 0x01, 0x26, 0x1c, 0x17, 0x57, 0x20, 0x07, 0x00, 0x4f, 0x11, 0x5f, 0x11, 0x6f, + 0x11, 0x03, 0x11, 0x55, 0x03, 0x0e, 0x04, 0x4f, 0x0d, 0x5f, 0x0d, 0x6f, 0x0d, 0x03, 0x0d, 0x55, + 0x07, 0x0a, 0x09, 0x02, 0x00, 0x3f, 0xd5, 0x32, 0xfd, 0x5d, 0x32, 0xd6, 0x32, 0xed, 0x5d, 0x32, + 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xd0, 0xd5, 0x5d, 0xed, 0x33, 0x11, 0x33, 0x11, 0x33, + 0x10, 0xc6, 0x5d, 0x2b, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x23, 0x35, 0x33, + 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, + 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x8f, + 0x6b, 0x6b, 0x6b, 0x6b, 0x7b, 0xc5, 0xc5, 0xc4, 0xc4, 0x0a, 0x12, 0x1a, 0x10, 0x11, 0x1d, 0x1b, + 0x1d, 0x11, 0x11, 0x22, 0x4f, 0x25, 0x2b, 0x42, 0x2e, 0x18, 0xcc, 0x54, 0x50, 0x66, 0x76, 0x14, + 0x8a, 0x66, 0x50, 0x54, 0x1a, 0x1a, 0x20, 0x12, 0x06, 0x02, 0x05, 0x0a, 0x08, 0x6a, 0x0e, 0x0c, + 0x0e, 0x28, 0x49, 0x3b, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x2b, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x02, 0x28, 0x1a, 0x04, 0x14, 0x50, 0x01, 0x06, 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xa0, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, 0x21, 0x13, 0x07, 0x00, + 0x50, 0x01, 0x09, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x12, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x02, 0x1a, 0x1b, 0x04, 0x14, 0x50, 0x01, 0x06, 0x1c, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0x87, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x13, 0x14, 0x07, 0x00, 0x50, 0x01, 0x09, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x35, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x1e, 0x28, 0x04, 0x14, 0x50, 0x01, + 0x06, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xaa, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x01, 0x17, 0x21, 0x07, 0x00, 0x50, 0x01, 0x09, 0x13, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x03, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3a, 0x00, 0x19, 0x00, 0x29, 0x00, 0x35, + 0x00, 0x60, 0x40, 0x24, 0x2a, 0x7f, 0x80, 0x1a, 0x01, 0x6f, 0x1a, 0x01, 0x30, 0x1a, 0x40, 0x1a, + 0x50, 0x1a, 0x03, 0x1a, 0x12, 0x44, 0x00, 0x15, 0x60, 0x15, 0x02, 0x15, 0x37, 0x30, 0x7f, 0x0f, + 0x22, 0x2f, 0x22, 0x02, 0x22, 0x08, 0x44, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0d, 0x11, 0x48, + 0x05, 0x36, 0x2d, 0x80, 0xb0, 0x27, 0x01, 0x27, 0x86, 0x33, 0x80, 0x1d, 0x03, 0x14, 0x02, 0x06, + 0x02, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x5d, 0xed, 0x01, + 0x10, 0xd6, 0x2b, 0xed, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0x5d, 0x5d, 0x5d, 0xed, + 0x31, 0x30, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x13, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, + 0x7b, 0x14, 0x32, 0x52, 0x2e, 0x3f, 0x2b, 0x14, 0x26, 0x1d, 0x11, 0x11, 0x1d, 0x26, 0x14, 0x2b, + 0x3f, 0x41, 0x18, 0x11, 0x0f, 0x19, 0x19, 0x0f, 0x11, 0x18, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, + 0x77, 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x6e, 0xfe, 0x89, 0x36, + 0x58, 0x3e, 0x21, 0x02, 0xe0, 0x32, 0x34, 0x0d, 0x1a, 0x26, 0x19, 0x19, 0x27, 0x1a, 0x0d, 0x34, + 0x33, 0x15, 0x15, 0x15, 0x15, 0x14, 0x16, 0x16, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xc3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x0c, + 0xb7, 0x02, 0x01, 0x01, 0x1a, 0x13, 0x07, 0x00, 0x50, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xda, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x65, + 0x00, 0x24, 0x00, 0x8a, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x26, 0x1c, 0x1e, 0x04, 0x14, 0x50, + 0x02, 0x06, 0x1f, 0x4f, 0x01, 0x06, 0x1b, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb4, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x65, 0x1b, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x1f, 0x15, 0x17, 0x07, + 0x00, 0x50, 0x02, 0x09, 0x18, 0x4f, 0x01, 0x09, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x01, 0x00, 0x27, 0xff, 0x56, 0x01, 0xcd, 0x02, 0x6b, 0x00, 0x2c, 0x00, 0x2b, 0x40, 0x16, + 0x27, 0x44, 0x29, 0x2e, 0x12, 0x05, 0x0c, 0x2e, 0x1d, 0x44, 0x1b, 0x2d, 0x28, 0x02, 0x1c, 0x02, + 0x22, 0x4a, 0x15, 0x09, 0x0f, 0x92, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xed, + 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x25, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x22, 0x2e, 0x02, + 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, + 0x06, 0x01, 0x87, 0x07, 0x1d, 0x1e, 0x17, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, 0x33, 0x1c, + 0x30, 0x2a, 0x19, 0x16, 0x3c, 0x4f, 0x2f, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, + 0x08, 0x7b, 0x1e, 0x18, 0x05, 0x1a, 0x1f, 0x1f, 0x0c, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, + 0x25, 0x1b, 0x17, 0x31, 0x15, 0x22, 0x3e, 0x57, 0x36, 0x01, 0x8b, 0xfe, 0x7d, 0x27, 0x35, 0x20, + 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x82, 0xfe, 0x75, 0x44, 0x63, 0x00, 0x00, 0x01, 0x00, 0x3b, + 0xff, 0x56, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x27, 0x00, 0x41, 0x40, 0x15, 0x19, 0x51, 0x1c, 0x29, + 0x06, 0x21, 0x00, 0x29, 0x60, 0x29, 0x01, 0x14, 0x51, 0x50, 0x11, 0x60, 0x11, 0x70, 0x11, 0x03, + 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0c, 0x48, 0x11, 0x28, 0x1a, 0x0a, 0x12, 0x0a, 0x17, + 0x57, 0x0c, 0x07, 0x03, 0x12, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, + 0xed, 0x5d, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x01, 0xb2, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1c, 0x19, 0x0e, 0x1b, 0x0d, 0x3a, 0x4a, 0x2b, 0x10, + 0x7b, 0x1f, 0x2d, 0x1c, 0x1c, 0x7c, 0x07, 0x1b, 0x1c, 0x15, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x9c, + 0x05, 0x09, 0x25, 0x1b, 0x18, 0x35, 0x16, 0x02, 0x02, 0x20, 0x3b, 0x50, 0x30, 0x01, 0x06, 0xf6, + 0x41, 0x3f, 0x05, 0x01, 0x71, 0xfe, 0x3a, 0x05, 0x17, 0x1c, 0x1d, 0x0c, 0x0a, 0x0e, 0x02, 0x05, + 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x2d, 0x29, + 0x1d, 0x0b, 0x50, 0x01, 0x0a, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x2d, 0x29, 0x10, 0x25, 0x50, 0x01, 0x10, 0x2a, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x19, 0x15, 0x11, 0x06, 0x50, 0x01, 0x05, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x05, 0x27, 0x23, 0x0d, 0x00, + 0x50, 0x01, 0x00, 0x24, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0b, 0x14, 0x12, 0x08, 0x06, 0x50, 0x01, 0x10, 0x13, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0a, + 0x14, 0x12, 0x08, 0x06, 0x50, 0x01, 0x10, 0x13, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x14, 0x1a, 0x08, 0x06, 0x50, 0x01, + 0x10, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x14, 0x1a, 0x08, 0x06, 0x50, 0x01, 0x10, 0x12, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x12, 0x16, 0x08, 0x06, 0x50, 0x01, 0x10, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x12, 0x16, 0x08, 0x06, + 0x50, 0x01, 0x10, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x8b, 0x00, 0x00, 0x01, 0xec, + 0x02, 0xb5, 0x00, 0x13, 0x00, 0x37, 0xb3, 0xa0, 0x09, 0x01, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x0c, + 0x09, 0x12, 0x48, 0x09, 0x15, 0x13, 0x51, 0xa0, 0x00, 0x01, 0x02, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x0b, 0x09, 0x12, 0x48, 0x00, 0x14, 0x13, 0x06, 0x0d, 0x57, 0x06, 0x01, 0x00, 0x3f, 0xed, 0x3f, + 0x01, 0x10, 0xd6, 0x2b, 0x5f, 0x5d, 0xed, 0x10, 0xc6, 0x2b, 0x5d, 0x31, 0x30, 0x33, 0x11, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x11, 0x8b, + 0x21, 0x38, 0x48, 0x26, 0x27, 0x52, 0x21, 0x15, 0x17, 0x45, 0x1f, 0x11, 0x1f, 0x17, 0x0e, 0x01, + 0xf1, 0x39, 0x4b, 0x2d, 0x13, 0x0c, 0x10, 0x65, 0x08, 0x10, 0x06, 0x14, 0x25, 0x1e, 0xfe, 0x11, + 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xcc, 0x02, 0x79, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xdd, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xdd, 0xb4, 0x38, 0x31, + 0x2b, 0x24, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0x56, 0x01, 0xba, + 0x01, 0xe2, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0xdd, 0x00, 0x00, 0x0d, + 0xb9, 0x00, 0x01, 0xff, 0xdf, 0xb4, 0x3b, 0x34, 0x2e, 0x25, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdb, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xe6, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xe6, 0xb4, 0x11, 0x0a, + 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd8, + 0x02, 0x60, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0x24, 0x00, 0x00, 0x0a, + 0xb6, 0x01, 0x20, 0x27, 0x20, 0x01, 0x15, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, + 0xff, 0x56, 0x01, 0x90, 0x01, 0xd5, 0x00, 0x13, 0x00, 0x25, 0x40, 0x14, 0x00, 0x44, 0x10, 0x12, + 0x0f, 0x08, 0x1f, 0x08, 0x02, 0x08, 0x14, 0x10, 0x55, 0x12, 0x0a, 0x09, 0x0c, 0x57, 0x05, 0x0e, + 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0xdd, 0xed, 0x31, 0x30, 0x25, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, + 0x35, 0x21, 0x01, 0x90, 0x1c, 0x31, 0x43, 0x27, 0x30, 0x52, 0x26, 0x26, 0x19, 0x47, 0x1d, 0x1f, + 0x22, 0xbe, 0x01, 0x39, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x18, 0x13, 0x68, 0x0e, 0x19, 0x25, 0x32, + 0x01, 0x56, 0x66, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x01, 0xe2, 0x01, 0x43, 0x02, 0xb5, 0x00, 0x0f, + 0x00, 0x10, 0xb5, 0x00, 0x09, 0x10, 0x08, 0x0f, 0x9f, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, + 0x31, 0x30, 0x01, 0x14, 0x14, 0x07, 0x0e, 0x03, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, + 0x01, 0x43, 0x01, 0x02, 0x09, 0x0f, 0x14, 0x0d, 0x57, 0x13, 0x0f, 0x01, 0x02, 0x02, 0xb5, 0x0b, + 0x10, 0x0b, 0x1c, 0x2e, 0x29, 0x26, 0x14, 0x18, 0x29, 0x44, 0x26, 0x0b, 0x15, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x70, 0x01, 0xfe, 0x01, 0x86, 0x02, 0xb3, 0x00, 0x05, 0x00, 0x3f, 0xb5, 0x04, + 0x20, 0x0c, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xe0, 0x40, 0x1a, 0x0c, 0x00, 0x4d, 0x05, 0x20, 0x0e, + 0x00, 0x4d, 0x01, 0x06, 0x03, 0x07, 0x05, 0x05, 0x06, 0x04, 0x07, 0x00, 0x06, 0x05, 0x03, 0x9f, + 0x02, 0x02, 0x01, 0x9f, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x12, 0x39, + 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x37, 0x17, + 0x37, 0x17, 0x07, 0x70, 0x31, 0x59, 0x59, 0x33, 0x8c, 0x02, 0x78, 0x3b, 0x45, 0x45, 0x3b, 0x7a, + 0x00, 0x01, 0x00, 0x6a, 0x02, 0x2c, 0x01, 0x8a, 0x02, 0x87, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x01, + 0x03, 0x04, 0x03, 0x01, 0x93, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x13, 0x21, + 0x15, 0x21, 0x6a, 0x01, 0x20, 0xfe, 0xe0, 0x02, 0x87, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, + 0x02, 0x16, 0x01, 0x8b, 0x02, 0xaa, 0x00, 0x13, 0x00, 0x1e, 0x40, 0x0e, 0x0d, 0x8f, 0x0e, 0x15, + 0x07, 0x8f, 0x06, 0x14, 0x0e, 0x06, 0x00, 0x7d, 0x0a, 0x02, 0x00, 0x3f, 0xed, 0xdc, 0xc0, 0x01, + 0x10, 0xd6, 0xe5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x15, 0x14, 0x0e, 0x02, 0xfa, 0x1f, 0x35, 0x27, 0x16, 0x5b, + 0x02, 0x1e, 0x16, 0x16, 0x1e, 0x03, 0x5a, 0x16, 0x27, 0x35, 0x02, 0x16, 0x13, 0x25, 0x34, 0x21, + 0x07, 0x26, 0x19, 0x19, 0x26, 0x07, 0x21, 0x34, 0x25, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, + 0x02, 0x18, 0x01, 0x41, 0x02, 0xa3, 0x00, 0x0b, 0x00, 0x12, 0xb7, 0x09, 0x95, 0x03, 0x0c, 0x00, + 0x96, 0x06, 0x98, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0xfa, 0x1d, 0x2a, 0x2a, 0x1d, 0x1d, 0x2a, 0x2a, + 0x02, 0x18, 0x25, 0x20, 0x20, 0x26, 0x26, 0x20, 0x20, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x91, + 0x01, 0xf6, 0x01, 0x63, 0x02, 0xc3, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x2b, 0x40, 0x19, 0x06, 0x08, + 0x10, 0x00, 0x4d, 0x00, 0x7f, 0x10, 0x16, 0x7f, 0x08, 0x1c, 0x03, 0x80, 0x5f, 0x19, 0x01, 0x9f, + 0x19, 0x01, 0x19, 0x13, 0x80, 0x0d, 0x8a, 0x00, 0x3f, 0xfd, 0xd6, 0x5d, 0x71, 0xed, 0x01, 0x10, + 0xd6, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x01, 0x63, 0x3f, 0x2b, 0x14, 0x26, 0x1d, 0x11, 0x11, 0x1d, 0x26, 0x14, 0x2b, 0x3f, 0x41, + 0x18, 0x11, 0x0f, 0x19, 0x19, 0x0f, 0x11, 0x18, 0x02, 0x5c, 0x32, 0x34, 0x0d, 0x1a, 0x26, 0x19, + 0x19, 0x27, 0x1a, 0x0d, 0x34, 0x33, 0x15, 0x15, 0x15, 0x15, 0x14, 0x16, 0x16, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xa3, 0xff, 0x56, 0x01, 0x5c, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x17, 0x40, 0x0a, + 0x00, 0x0f, 0x06, 0x16, 0x0b, 0x06, 0x09, 0x06, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xd5, 0xcc, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x5a, 0x0e, 0x33, 0x1c, 0x30, 0x2a, + 0x2d, 0x24, 0x68, 0x07, 0x1b, 0x1b, 0x14, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x9c, 0x05, 0x09, 0x25, + 0x1b, 0x1e, 0x43, 0x16, 0x05, 0x16, 0x1b, 0x1c, 0x0c, 0x0a, 0x0e, 0x02, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x43, 0x01, 0xfe, 0x01, 0xb6, 0x02, 0xb4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x26, + 0x40, 0x14, 0x04, 0x06, 0x00, 0x00, 0x02, 0x10, 0x02, 0x02, 0x02, 0x08, 0x05, 0x07, 0xa0, 0x04, + 0x04, 0x01, 0x03, 0xa0, 0x00, 0x04, 0x00, 0x3f, 0x3f, 0xc5, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, + 0x5d, 0xd5, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x17, 0x07, 0x27, 0x37, 0x01, 0x02, + 0x90, 0x2f, 0x79, 0xfa, 0x90, 0x2f, 0x7a, 0x02, 0x6e, 0x70, 0x31, 0x85, 0x46, 0x70, 0x31, 0x84, + 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x43, 0xff, 0xe6, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf2, 0x40, + 0x09, 0x2c, 0x2a, 0x1d, 0x0b, 0x50, 0x01, 0x0a, 0x2b, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x43, 0xe6, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf2, 0x40, 0x09, 0x2c, + 0x2a, 0x10, 0x25, 0x50, 0x01, 0x10, 0x2b, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x17, + 0x00, 0x00, 0x01, 0xdd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0b, 0x2b, 0x29, 0x1d, 0x0b, 0x50, 0x01, + 0x0a, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x0b, 0x2b, 0x29, 0x10, 0x25, 0x50, 0x01, 0x10, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x2b, + 0x3d, 0x1d, 0x0b, 0x50, 0x02, 0x0a, 0x35, 0x4f, 0x01, 0x0a, 0x29, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0xa1, 0x02, 0x26, + 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x01, 0x2b, 0x3d, 0x10, 0x25, 0x50, 0x02, 0x10, 0x35, 0x4f, 0x01, 0x10, 0x29, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xdd, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xe8, 0x40, 0x09, 0x18, 0x16, 0x11, 0x06, 0x50, 0x01, 0x05, 0x17, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xe6, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xf6, 0x40, 0x09, 0x26, 0x24, 0x0d, 0x00, 0x50, 0x01, 0x00, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, 0x02, 0x6b, 0x00, 0x03, 0x00, 0x18, 0x40, 0x0b, + 0x00, 0x79, 0x03, 0x01, 0x79, 0x02, 0x04, 0x01, 0x06, 0x00, 0x04, 0x00, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xed, 0xd5, 0xed, 0x31, 0x30, 0x01, 0x01, 0x23, 0x01, 0x01, 0xda, 0xfe, 0xa3, 0x64, 0x01, + 0x5d, 0x02, 0x6b, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x03, 0x00, 0x66, 0x01, 0x07, 0x01, 0x8f, + 0x02, 0x79, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x32, 0x40, 0x1b, 0x06, 0x84, 0xaf, 0x0c, + 0xbf, 0x0c, 0x02, 0x0c, 0x18, 0x7f, 0x1e, 0x12, 0x84, 0x00, 0x24, 0x15, 0x7d, 0x1b, 0x21, 0x03, + 0x09, 0x09, 0x25, 0x0f, 0x7d, 0x03, 0x01, 0x00, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, + 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x66, 0x4d, 0x48, 0x47, 0x4d, 0x4d, 0x47, 0x48, 0x4d, 0xca, 0x16, 0x1e, 0x1e, 0x19, 0x19, 0x1e, + 0x1e, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x10, 0x0e, 0x0e, 0x10, 0x01, 0xc0, 0x59, 0x60, 0x60, + 0x59, 0x59, 0x60, 0x60, 0x59, 0x2f, 0x3a, 0x3a, 0x2f, 0x30, 0x39, 0x39, 0x33, 0x10, 0x16, 0x16, + 0x10, 0x10, 0x16, 0x16, 0x00, 0x02, 0x00, 0x59, 0x01, 0x0d, 0x01, 0x7d, 0x02, 0x72, 0x00, 0x0c, + 0x00, 0x11, 0x00, 0x56, 0x40, 0x0a, 0x03, 0x40, 0x0a, 0x0c, 0x00, 0x4c, 0x0f, 0x03, 0x01, 0x06, + 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x09, 0x0a, 0x00, 0x4c, 0x03, 0x02, 0x01, 0x04, 0x04, 0x01, 0x8f, + 0x07, 0x11, 0x10, 0x00, 0x08, 0x10, 0x08, 0x02, 0x08, 0x12, 0x0d, 0x11, 0x05, 0x04, 0x07, 0x01, + 0x11, 0x11, 0x01, 0x07, 0x04, 0x05, 0x05, 0x13, 0x00, 0x04, 0x00, 0x3f, 0x11, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x01, 0x10, 0xd6, 0x5d, 0xc5, 0xd5, 0x32, 0xed, 0x32, 0x2f, + 0x10, 0xc5, 0x32, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x5d, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, 0x01, 0x54, 0x29, 0x29, + 0x54, 0xa7, 0x26, 0x4d, 0x30, 0x04, 0x14, 0x25, 0x10, 0x49, 0x02, 0x72, 0xce, 0x4a, 0x4d, 0x4d, + 0x40, 0x40, 0x65, 0x33, 0x63, 0x17, 0x34, 0x20, 0x00, 0x01, 0x00, 0x71, 0x01, 0x07, 0x01, 0x7c, + 0x02, 0x72, 0x00, 0x1c, 0x00, 0x80, 0xb9, 0x00, 0x1c, 0xff, 0xc0, 0x40, 0x0f, 0x0c, 0x00, 0x4d, + 0x11, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x0f, 0x40, 0x13, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xc0, 0xb3, + 0x0a, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x37, 0x09, 0x00, 0x4d, 0xaf, 0x0e, 0x01, 0x08, + 0x20, 0x0c, 0x00, 0x4d, 0x16, 0x0c, 0x84, 0x20, 0x00, 0x30, 0x00, 0x40, 0x00, 0x03, 0x00, 0x1e, + 0x17, 0x14, 0x0f, 0x06, 0x1d, 0x07, 0x7f, 0x0a, 0x8f, 0x0a, 0x9f, 0x0a, 0x03, 0x0a, 0x7d, 0x03, + 0xbf, 0x0f, 0x01, 0x0f, 0x7d, 0x1a, 0x03, 0x1a, 0x03, 0x1a, 0x1e, 0x17, 0x16, 0x45, 0x15, 0x04, + 0x00, 0x3f, 0xed, 0x32, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, + 0x01, 0x10, 0xd6, 0xd6, 0xc4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x5d, + 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, + 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x01, 0x7c, 0x42, 0x53, 0x20, 0x41, 0x15, 0x14, 0x12, 0x26, 0x21, 0x3a, 0x49, 0x47, 0x03, + 0x05, 0x05, 0x04, 0x02, 0xd4, 0x89, 0x02, 0x02, 0x57, 0x43, 0x01, 0x7f, 0x35, 0x43, 0x0b, 0x0b, + 0x4f, 0x07, 0x0b, 0x24, 0x1e, 0x0c, 0x18, 0x39, 0x39, 0x31, 0x0f, 0x51, 0x09, 0x1f, 0x0a, 0x02, + 0x3b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x01, 0x07, 0x01, 0x73, 0x02, 0x73, 0x00, 0x0a, + 0x00, 0x1f, 0x00, 0x77, 0x40, 0x12, 0x1d, 0x40, 0x18, 0x00, 0x4d, 0x04, 0x40, 0x11, 0x12, 0x00, + 0x4c, 0x03, 0x40, 0x11, 0x12, 0x00, 0x4c, 0x14, 0xb8, 0xff, 0xf0, 0xb3, 0x0f, 0x00, 0x4d, 0x05, + 0xb8, 0xff, 0xc0, 0x40, 0x33, 0x13, 0x14, 0x00, 0x4c, 0x1a, 0x80, 0x08, 0x90, 0x08, 0x02, 0x08, + 0x7c, 0x00, 0x0e, 0x01, 0x20, 0x0e, 0x60, 0x0e, 0xa0, 0x0e, 0x03, 0x0e, 0x21, 0x8f, 0x1d, 0x9f, + 0x1d, 0x02, 0x1d, 0x03, 0x7c, 0x16, 0x20, 0x7f, 0x05, 0x01, 0x05, 0x7d, 0x13, 0x0b, 0x00, 0x13, + 0x00, 0x13, 0x00, 0x21, 0x1a, 0x7d, 0x19, 0x03, 0x00, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xc1, 0x10, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0xc1, 0x5d, 0x10, 0xd6, 0x5d, 0x71, 0xed, + 0x5d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x22, 0x06, 0x07, 0x06, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x17, 0x06, 0x06, 0x07, 0x36, 0x36, 0xe6, 0x0b, 0x18, 0x06, 0x05, 0x38, + 0x17, 0x13, 0x17, 0x0b, 0x43, 0x38, 0x10, 0x21, 0x32, 0x22, 0x45, 0x47, 0x81, 0x73, 0x04, 0x3f, + 0x45, 0x12, 0x08, 0x1d, 0x01, 0xac, 0x06, 0x03, 0x50, 0x1b, 0x11, 0x17, 0x16, 0x41, 0x3d, 0x2e, + 0x18, 0x2d, 0x22, 0x14, 0x4f, 0x49, 0x63, 0x71, 0x50, 0x02, 0x20, 0x1e, 0x04, 0x06, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x6b, 0x01, 0x0e, 0x01, 0x7d, 0x02, 0x72, 0x00, 0x0c, 0x00, 0x3f, 0x40, 0x28, + 0x0b, 0x40, 0x09, 0x00, 0x4d, 0x0a, 0x40, 0x09, 0x00, 0x4d, 0x08, 0x20, 0x15, 0x00, 0x4d, 0x08, + 0x20, 0x12, 0x00, 0x4d, 0x08, 0x20, 0x0e, 0x0f, 0x00, 0x4c, 0x0c, 0x07, 0x03, 0x00, 0x05, 0x0d, + 0x00, 0x00, 0x0e, 0x07, 0x03, 0x73, 0x06, 0x04, 0x00, 0x3f, 0xed, 0x32, 0x12, 0x39, 0x2f, 0x01, + 0x10, 0xd6, 0xc4, 0xd5, 0xd5, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, + 0x37, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x03, 0x07, 0xa3, 0x0d, 0x32, 0x28, 0x9f, 0x01, 0x12, 0x12, + 0x24, 0x20, 0x18, 0x06, 0x01, 0x0e, 0x58, 0x80, 0x36, 0x56, 0x4b, 0x14, 0x3d, 0x49, 0x54, 0x2b, + 0x00, 0x03, 0x00, 0x6a, 0x01, 0x07, 0x01, 0x8a, 0x02, 0x79, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, + 0x00, 0xa8, 0xb9, 0x00, 0x31, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x31, 0xb8, 0xff, 0xc0, 0xb3, + 0x0c, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xc8, 0xb3, 0x10, 0x00, 0x4d, 0x29, 0xb8, 0xff, 0xc0, 0x40, + 0x09, 0x0b, 0x00, 0x4d, 0x1e, 0x20, 0x0f, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, + 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x0e, 0x00, 0x4d, 0x0b, 0x20, 0x15, 0x16, 0x00, 0x4c, + 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x08, 0x36, 0x0e, 0x24, 0x2a, 0x30, 0x1e, 0x04, 0x0b, 0x1b, 0x00, + 0x18, 0x37, 0x40, 0x0e, 0x50, 0x0e, 0x02, 0x40, 0x0b, 0x01, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x1f, + 0x0b, 0x00, 0x4d, 0x0e, 0x0b, 0x1b, 0x18, 0x18, 0x1b, 0x0b, 0x0e, 0x04, 0x36, 0x37, 0x2d, 0x33, + 0x27, 0x21, 0x04, 0x13, 0x10, 0x03, 0x01, 0x03, 0x03, 0x37, 0x3f, 0x13, 0x01, 0x13, 0x05, 0x00, + 0x3f, 0x5d, 0x12, 0x39, 0x2f, 0x5d, 0x12, 0x17, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2b, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x06, 0x07, 0x16, 0x16, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x06, + 0x06, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x01, 0x8a, 0x43, + 0x4e, 0x2c, 0x38, 0x20, 0x0b, 0x20, 0x18, 0x19, 0x16, 0x11, 0x21, 0x33, 0x22, 0x27, 0x34, 0x1f, + 0x0d, 0x1c, 0x16, 0x21, 0x1a, 0xc2, 0x15, 0x1d, 0x1c, 0x16, 0x25, 0x1e, 0x0f, 0x12, 0x5e, 0x14, + 0x17, 0x17, 0x14, 0x16, 0x1d, 0x12, 0x11, 0x01, 0x71, 0x2f, 0x3b, 0x14, 0x1e, 0x23, 0x0f, 0x20, + 0x27, 0x0f, 0x12, 0x24, 0x1b, 0x14, 0x25, 0x1d, 0x11, 0x12, 0x1c, 0x23, 0x10, 0x18, 0x2a, 0x0d, + 0x14, 0x29, 0x1b, 0x0d, 0x18, 0x17, 0x0e, 0x16, 0x19, 0x06, 0x0a, 0x19, 0x8f, 0x0b, 0x17, 0x17, + 0x0b, 0x0f, 0x1b, 0x08, 0x0a, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0x01, 0x0d, 0x01, 0x92, + 0x02, 0x79, 0x00, 0x0a, 0x00, 0x21, 0x00, 0x86, 0xb9, 0x00, 0x1c, 0xff, 0xc0, 0xb4, 0x14, 0x16, + 0x00, 0x4c, 0x1b, 0xb8, 0xff, 0xc0, 0xb4, 0x14, 0x16, 0x00, 0x4c, 0x1d, 0xb8, 0xff, 0xc0, 0xb3, + 0x10, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x40, 0x10, 0x00, 0x4d, 0x0d, 0x20, 0x17, 0x00, + 0x4d, 0x0d, 0x40, 0x13, 0x00, 0x4d, 0x0c, 0x40, 0x16, 0x00, 0x4d, 0x0c, 0x40, 0x14, 0x00, 0x4d, + 0x00, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x1f, 0x84, 0x03, 0x84, 0x7f, 0x18, 0x01, 0x20, 0x18, 0x01, + 0x18, 0x23, 0x1c, 0x08, 0x84, 0x10, 0x22, 0x70, 0x1b, 0x01, 0x1b, 0x7d, 0x1c, 0x0b, 0x7d, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x23, 0x05, 0x7d, 0x15, 0x05, 0x00, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x10, 0xed, 0x10, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, 0x5d, 0x5d, 0xed, + 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x32, + 0x36, 0x37, 0x36, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x27, 0x36, 0x36, 0x37, 0x06, 0x06, 0x01, 0x0f, + 0x0b, 0x18, 0x06, 0x05, 0x36, 0x17, 0x15, 0x17, 0x0a, 0x21, 0x2f, 0x1e, 0x0d, 0x10, 0x21, 0x32, + 0x22, 0x46, 0x46, 0x76, 0x7e, 0x04, 0x45, 0x43, 0x0f, 0x08, 0x1e, 0x01, 0xd6, 0x05, 0x04, 0x4f, + 0x19, 0x11, 0x16, 0x18, 0x43, 0x11, 0x1e, 0x28, 0x17, 0x17, 0x2b, 0x22, 0x14, 0x51, 0x48, 0x62, + 0x71, 0x4f, 0x02, 0x1f, 0x20, 0x04, 0x06, 0x00, 0xff, 0xff, 0x00, 0x66, 0xff, 0xfb, 0x01, 0x8f, + 0x01, 0x6d, 0x02, 0x07, 0x01, 0x6f, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, + 0x00, 0x02, 0x01, 0xa6, 0x01, 0x66, 0x02, 0x07, 0x00, 0x94, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x71, 0x00, 0x02, 0x01, 0x82, 0x01, 0x6d, 0x02, 0x07, 0x00, 0x8d, 0x00, 0x00, + 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0xfb, 0x01, 0x80, 0x01, 0x6d, 0x02, 0x07, + 0x00, 0x8e, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0x00, 0x01, 0x01, 0x7d, + 0x01, 0x66, 0x02, 0x07, 0x01, 0x70, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, + 0xff, 0xfb, 0x01, 0x7c, 0x01, 0x66, 0x02, 0x07, 0x01, 0x71, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x62, 0xff, 0xfb, 0x01, 0x73, 0x01, 0x67, 0x02, 0x07, 0x01, 0x72, 0x00, 0x00, + 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0x00, 0x02, 0x01, 0x7d, 0x01, 0x66, 0x02, 0x07, + 0x01, 0x73, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xfb, 0x01, 0x8a, + 0x01, 0x6d, 0x02, 0x07, 0x01, 0x74, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, + 0x00, 0x01, 0x01, 0x92, 0x01, 0x6d, 0x02, 0x07, 0x01, 0x75, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x35, 0xff, 0xf3, 0x01, 0xad, 0x02, 0xb5, 0x00, 0x21, 0x00, 0x2f, 0x00, 0x34, + 0x40, 0x1d, 0x25, 0x49, 0x0b, 0x16, 0x31, 0x0e, 0x20, 0x2f, 0x30, 0x2f, 0x02, 0x2f, 0x52, 0x1f, + 0x01, 0x10, 0x21, 0x01, 0x21, 0x30, 0x15, 0x12, 0x7d, 0x19, 0x07, 0x2a, 0x80, 0x06, 0x10, 0x00, + 0x3f, 0xed, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0x32, 0xed, 0x5d, 0x32, 0x10, 0xd6, + 0xd6, 0xed, 0x31, 0x30, 0x37, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x35, 0x07, 0x27, 0x37, 0x36, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x90, + 0x18, 0x28, 0x36, 0x1d, 0x26, 0x2f, 0x1b, 0x09, 0x66, 0x54, 0x2a, 0x2d, 0x1d, 0x26, 0x10, 0x21, + 0x17, 0x40, 0x2b, 0x2c, 0x3c, 0x24, 0x0f, 0x3b, 0x20, 0xad, 0x39, 0x40, 0x04, 0x0c, 0x15, 0x11, + 0x0e, 0x18, 0x12, 0x0b, 0xe4, 0x01, 0x02, 0x3d, 0x51, 0x2e, 0x13, 0x1c, 0x2d, 0x36, 0x1a, 0x5f, + 0x9d, 0x46, 0x27, 0x3f, 0x39, 0x16, 0x0b, 0x3e, 0x14, 0x17, 0x1a, 0x2d, 0x3b, 0x20, 0x07, 0x2a, + 0x30, 0x82, 0x34, 0x79, 0x4c, 0x0f, 0x1e, 0x18, 0x0f, 0x0a, 0x1e, 0x35, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf4, 0x01, 0xd9, 0x01, 0x86, 0x00, 0x20, 0x00, 0x31, 0x00, 0x61, + 0xb9, 0x00, 0x1d, 0xff, 0xe0, 0x40, 0x40, 0x0c, 0x00, 0x4d, 0x2f, 0x28, 0x14, 0x00, 0x4d, 0x40, + 0x0d, 0x01, 0x0d, 0x33, 0xb0, 0x1f, 0x01, 0x2f, 0x1f, 0x3f, 0x1f, 0x6f, 0x1f, 0x7f, 0x1f, 0x8f, + 0x1f, 0x05, 0x00, 0x1f, 0x01, 0x1f, 0x8f, 0x2f, 0x02, 0x7f, 0x2c, 0x01, 0x2c, 0x7c, 0x15, 0x32, + 0x0f, 0x2f, 0x1f, 0x2f, 0x2f, 0x2f, 0x5f, 0x2f, 0x6f, 0x2f, 0x7f, 0x2f, 0xaf, 0x2f, 0xbf, 0x2f, + 0x08, 0x2f, 0x26, 0x1a, 0xa3, 0x10, 0x07, 0x00, 0x3f, 0x3f, 0xd5, 0xc6, 0x5d, 0x01, 0x10, 0xd6, + 0xfd, 0x5d, 0x32, 0xd6, 0xed, 0x5d, 0x5d, 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x01, + 0x2b, 0x37, 0x22, 0x15, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x27, + 0x34, 0x27, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x15, 0x15, 0x14, 0x33, 0x21, 0x32, 0x35, + 0x70, 0x04, 0x03, 0x02, 0x1c, 0x44, 0x2a, 0x2c, 0x49, 0x1b, 0x20, 0x1d, 0x5e, 0x36, 0x2f, 0x51, + 0x3c, 0x23, 0x23, 0x3c, 0x51, 0x2f, 0x2e, 0x51, 0x3d, 0x23, 0x52, 0x05, 0x1a, 0x45, 0x28, 0x29, + 0x45, 0x1b, 0x06, 0x04, 0x01, 0x14, 0x03, 0xb7, 0x02, 0x6e, 0x04, 0x05, 0x03, 0x1d, 0x1f, 0x25, + 0x1e, 0x23, 0x2b, 0x20, 0x36, 0x49, 0x29, 0x2a, 0x4a, 0x36, 0x20, 0x20, 0x36, 0x4a, 0x2a, 0x05, + 0x7d, 0x06, 0x07, 0x1a, 0x1f, 0x20, 0x1b, 0x06, 0x08, 0x6b, 0x04, 0x04, 0x00, 0x03, 0x00, 0x02, + 0xff, 0xf8, 0x01, 0xf5, 0x02, 0x72, 0x00, 0x27, 0x00, 0x32, 0x00, 0x36, 0x00, 0xba, 0xb9, 0x00, + 0x0d, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb4, 0x1b, 0x1c, 0x00, 0x4c, + 0x0b, 0xb8, 0xff, 0xc0, 0xb4, 0x19, 0x1c, 0x00, 0x4c, 0x0a, 0xb8, 0xff, 0xc0, 0xb4, 0x19, 0x1c, + 0x00, 0x4c, 0x00, 0xb8, 0xff, 0xe0, 0x40, 0x52, 0x20, 0x00, 0x4d, 0x34, 0x36, 0x35, 0x36, 0xaf, + 0x33, 0x34, 0x14, 0x33, 0x34, 0x33, 0x38, 0x06, 0x7c, 0x1f, 0x38, 0x0e, 0x7c, 0x1b, 0x38, 0x35, + 0x37, 0x90, 0x2d, 0x01, 0x2d, 0x8f, 0x2e, 0x28, 0x37, 0x15, 0x09, 0xef, 0x27, 0x01, 0x27, 0x33, + 0x36, 0x04, 0x35, 0x34, 0x0c, 0x32, 0x2f, 0x28, 0x28, 0x2f, 0x32, 0x03, 0x2b, 0x30, 0x2d, 0x60, + 0x2d, 0x02, 0x2d, 0x9c, 0x2b, 0x04, 0x08, 0x80, 0x0a, 0x18, 0x0b, 0x1d, 0x1d, 0x0b, 0x18, 0x03, + 0x80, 0x24, 0x09, 0x11, 0x80, 0x0f, 0x18, 0x01, 0x18, 0x9a, 0x00, 0x3f, 0x71, 0xed, 0x3f, 0xed, + 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x12, 0x39, 0xed, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x3f, 0x33, 0x3f, 0x33, 0x01, 0x2f, 0x5d, 0xc4, 0xc6, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xc2, 0x10, 0xd4, 0xed, 0x10, 0xd4, 0xed, 0x10, 0xd0, 0x87, 0x2b, 0x87, 0x7d, 0xc4, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, + 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0x2b, + 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3c, 0x13, 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x28, 0x09, 0x17, + 0x0f, 0x38, 0x1d, 0x35, 0x2f, 0x1d, 0x2a, 0x13, 0x22, 0x2d, 0x1b, 0x1d, 0x32, 0x11, 0xfe, 0xea, + 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0xaa, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x46, + 0x05, 0x0b, 0x09, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, + 0x1a, 0x26, 0x12, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0x02, 0x24, 0x0f, 0x1f, 0x17, + 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0x79, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0xff, 0xf8, 0x01, 0xf5, 0x02, 0x79, 0x00, 0x27, 0x00, 0x45, 0x00, 0x49, 0x00, 0xd1, 0xb9, 0x00, + 0x34, 0xff, 0xe0, 0x40, 0x0a, 0x12, 0x00, 0x4d, 0x30, 0x20, 0x13, 0x14, 0x00, 0x4c, 0x0d, 0xb8, + 0xff, 0xc0, 0xb3, 0x1c, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x0c, 0xb8, + 0xff, 0xc0, 0xb4, 0x1a, 0x1c, 0x00, 0x4c, 0x0b, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1c, 0x00, 0x4c, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x37, 0x1a, 0x1c, 0x00, 0x4c, 0x49, 0x47, 0x46, 0x47, 0xaf, 0x48, + 0x49, 0x14, 0x48, 0x48, 0x49, 0x46, 0x4b, 0x0e, 0x06, 0x7c, 0x1f, 0x1b, 0x4b, 0x48, 0x4a, 0x34, + 0x7c, 0x40, 0x40, 0x29, 0x3a, 0x4a, 0x29, 0x2a, 0x4a, 0x15, 0x09, 0xef, 0x27, 0x01, 0x27, 0x49, + 0x04, 0x48, 0x47, 0x0c, 0x46, 0x39, 0x36, 0x99, 0x3d, 0x03, 0x28, 0x81, 0x29, 0xb8, 0xff, 0xc0, + 0x40, 0x1d, 0x0c, 0x00, 0x4d, 0x60, 0x29, 0x90, 0x29, 0xb0, 0x29, 0xe0, 0x29, 0x04, 0x29, 0x9c, + 0x0b, 0x80, 0x08, 0x1d, 0x08, 0x1d, 0x18, 0x03, 0x80, 0x24, 0x09, 0x11, 0x80, 0x18, 0x9a, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x3f, 0x5d, 0x2b, 0xed, + 0x3f, 0xfd, 0xc6, 0x2f, 0x3f, 0x2f, 0x3f, 0x01, 0x2f, 0x5d, 0xc4, 0xc6, 0x10, 0xd6, 0xc5, 0x10, + 0xc0, 0x11, 0x39, 0x10, 0xed, 0x10, 0xc6, 0x10, 0xc4, 0xd4, 0xed, 0x32, 0x10, 0xc4, 0x87, 0x10, + 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x25, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x03, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, + 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0x2b, 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3c, 0x13, + 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x28, 0x09, 0x17, 0x0f, 0x38, 0x1d, 0x35, 0x2f, 0x1d, 0x2a, + 0x13, 0x22, 0x2d, 0x1b, 0x1d, 0x32, 0x11, 0x42, 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, 0x10, 0x0c, + 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, 0x01, 0x69, + 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x46, 0x05, 0x0b, 0x09, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, + 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, 0x1a, 0x26, 0x12, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, + 0x08, 0x01, 0xac, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, 0x0e, 0x0d, 0x16, 0x10, + 0x0d, 0x36, 0x16, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, 0xfd, 0x95, 0x02, 0x6b, + 0x00, 0x05, 0x00, 0x02, 0xff, 0xf9, 0x01, 0xec, 0x02, 0x72, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x30, + 0x00, 0x3d, 0x00, 0x41, 0x00, 0xb2, 0xb9, 0x00, 0x32, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x31, + 0xb8, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x2b, 0xb8, 0xff, 0xc0, 0x40, 0x61, 0x12, 0x00, 0x4d, + 0x00, 0x40, 0x1d, 0x00, 0x4d, 0x00, 0x40, 0x17, 0x18, 0x00, 0x4c, 0x41, 0x3f, 0x3e, 0x3f, 0xaf, + 0x40, 0x41, 0x14, 0x40, 0x40, 0x41, 0x3e, 0x43, 0x00, 0x00, 0x7c, 0x2b, 0x26, 0x7c, 0x15, 0x70, + 0x06, 0x80, 0x06, 0x90, 0x06, 0x03, 0x06, 0x7c, 0x31, 0x38, 0x7c, 0x10, 0x15, 0x43, 0x40, 0x42, + 0x90, 0x20, 0x01, 0x20, 0x8f, 0x21, 0x1b, 0x42, 0x41, 0x04, 0x40, 0x0c, 0x3f, 0x0c, 0x3e, 0x04, + 0x25, 0x22, 0x1b, 0x1b, 0x22, 0x25, 0x03, 0x1f, 0x30, 0x20, 0x60, 0x20, 0x02, 0x20, 0x9c, 0x1f, + 0x04, 0x35, 0x80, 0x29, 0x29, 0x3b, 0x2e, 0x80, 0x18, 0x0d, 0x3b, 0x80, 0x0b, 0x9a, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x11, 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd4, 0xed, 0x5d, 0x10, 0xc6, 0x10, 0xd6, 0xd4, 0xfd, + 0xd6, 0xed, 0x5d, 0x10, 0xfd, 0xd2, 0xe9, 0x2f, 0x10, 0xcc, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, + 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, + 0x26, 0x01, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x34, 0x26, 0x27, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, 0x17, 0x17, 0x36, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x13, 0x01, 0x23, 0x01, 0x01, 0x02, 0x12, 0x15, 0x0d, 0x11, 0x13, 0x1e, + 0x27, 0x14, 0x14, 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, 0x41, 0xff, + 0x00, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0x89, 0x23, 0x18, 0x14, 0x19, 0x0e, + 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, 0x13, 0x0c, 0x09, 0x16, 0x5f, 0xfe, 0xc3, 0x64, + 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, + 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, 0x02, 0x0e, 0x0f, 0x1f, 0x17, 0xfa, 0x96, + 0x0b, 0x0c, 0x05, 0xfe, 0x56, 0x0c, 0x0c, 0x07, 0x0b, 0x13, 0x0b, 0x0a, 0x09, 0x7c, 0x06, 0x0c, + 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, 0x08, 0x07, 0x01, 0xaa, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x03, 0xff, 0xf9, 0x01, 0xf5, 0x02, 0x79, 0x00, 0x1a, 0x00, 0x42, 0x00, 0x4d, + 0x00, 0x5a, 0x00, 0x5e, 0x00, 0xd8, 0xb5, 0x48, 0x40, 0x15, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, + 0x40, 0x84, 0x14, 0x15, 0x00, 0x4c, 0x00, 0x40, 0x22, 0x00, 0x4d, 0x00, 0x40, 0x15, 0x18, 0x00, + 0x4c, 0x3d, 0x40, 0x0c, 0x00, 0x4d, 0x24, 0x40, 0x1a, 0x1b, 0x00, 0x4c, 0x23, 0x40, 0x1a, 0x1b, + 0x00, 0x4c, 0x21, 0x40, 0x1b, 0x00, 0x4d, 0x5c, 0x5e, 0x5d, 0x5e, 0xaf, 0x5b, 0x5c, 0x14, 0x5b, + 0x5c, 0x5b, 0x60, 0x21, 0x7c, 0x3a, 0x29, 0x7c, 0x36, 0x3a, 0x36, 0x3a, 0x36, 0x60, 0x5f, 0x00, + 0x40, 0x14, 0x00, 0x4d, 0x9f, 0x00, 0xaf, 0x00, 0x02, 0x00, 0x7c, 0x48, 0x43, 0x7c, 0x15, 0x06, + 0x7c, 0x4e, 0x55, 0x7c, 0x10, 0x15, 0x60, 0x5d, 0x5f, 0x30, 0x42, 0x5f, 0x5e, 0x04, 0x5d, 0x0c, + 0x5c, 0x0c, 0x5b, 0x04, 0x38, 0x38, 0x33, 0x1e, 0x80, 0x30, 0x3f, 0x60, 0x3f, 0xb0, 0x3f, 0x03, + 0x3f, 0x9d, 0x23, 0x81, 0x26, 0x2c, 0x80, 0x33, 0x03, 0x51, 0x80, 0x46, 0x46, 0x58, 0x4b, 0x80, + 0x18, 0x0d, 0x58, 0x80, 0x0b, 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x10, 0xed, 0x3f, + 0xfd, 0xd6, 0xed, 0x3f, 0x5d, 0xed, 0x12, 0x39, 0x3d, 0x2f, 0x18, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0xc6, 0x10, 0xc2, 0x10, 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x10, 0xfd, 0xd6, 0xed, 0x5d, + 0x2b, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x10, 0xed, 0x10, 0xd4, 0x87, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, + 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x03, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, + 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, 0x34, + 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, 0x17, 0x17, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x13, 0x01, 0x23, 0x01, 0x01, 0x0b, 0x12, 0x15, 0x0e, 0x10, + 0x13, 0x1e, 0x27, 0x14, 0x14, 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, + 0x41, 0xf6, 0x0b, 0x27, 0x14, 0x17, 0x18, 0x3c, 0x14, 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x27, + 0x0a, 0x16, 0x0e, 0x38, 0x1e, 0x34, 0x30, 0x1e, 0x2a, 0x13, 0x22, 0x2d, 0x1b, 0x1c, 0x33, 0x10, + 0x01, 0xa4, 0x23, 0x18, 0x14, 0x18, 0x0f, 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, 0x13, + 0x0c, 0x0a, 0x15, 0x68, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, 0x14, + 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, + 0x01, 0x9e, 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, + 0x0e, 0x29, 0x1a, 0x25, 0x13, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0xfe, 0xc8, 0x0c, + 0x0c, 0x07, 0x0b, 0x13, 0x0b, 0x0a, 0x09, 0x7c, 0x06, 0x0c, 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, + 0x08, 0x07, 0x01, 0xaa, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x05, 0x00, 0x05, 0xff, 0xf9, 0x01, 0xf5, + 0x02, 0x72, 0x00, 0x1a, 0x00, 0x3b, 0x00, 0x46, 0x00, 0x53, 0x00, 0x57, 0x01, 0x3e, 0x40, 0x17, + 0x3a, 0x40, 0x19, 0x1b, 0x00, 0x4c, 0x3a, 0x40, 0x15, 0x00, 0x4d, 0x39, 0x40, 0x19, 0x1b, 0x00, + 0x4c, 0x39, 0x40, 0x0e, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xe0, 0xb3, 0x12, 0x00, 0x4d, 0x03, 0xb8, + 0xff, 0xc0, 0x40, 0x14, 0x14, 0x00, 0x4d, 0x00, 0x40, 0x17, 0x18, 0x00, 0x4c, 0x00, 0x50, 0x16, + 0x00, 0x4d, 0x00, 0x40, 0x15, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x27, + 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x27, 0xb8, 0xff, 0xe0, 0xb3, 0x1d, 0x00, 0x4d, 0x27, + 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1c, 0x00, 0x4c, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, + 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x1b, 0x00, 0x4d, + 0x1c, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0xb3, 0x1c, 0x00, 0x4d, + 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x66, 0x19, 0x1a, 0x00, 0x4c, 0x55, 0x57, 0x56, 0x57, 0xaf, 0x54, + 0x55, 0x14, 0x54, 0x55, 0x54, 0x59, 0x2d, 0x7c, 0xa0, 0x1e, 0xe0, 0x1e, 0x02, 0x1e, 0x59, 0xaf, + 0x00, 0xbf, 0x00, 0x02, 0x00, 0x7c, 0x41, 0x3c, 0x7c, 0x15, 0x06, 0x7c, 0x47, 0x4e, 0x7c, 0x10, + 0x15, 0x59, 0x56, 0x58, 0x3b, 0x82, 0x39, 0x50, 0x38, 0x01, 0x38, 0x26, 0x58, 0x57, 0x04, 0x56, + 0x0c, 0x55, 0x0c, 0x54, 0x04, 0x3a, 0x81, 0x39, 0x04, 0x32, 0x81, 0x26, 0x1b, 0x1b, 0x23, 0x38, + 0x04, 0x2a, 0x80, 0x30, 0x23, 0x01, 0x60, 0x23, 0xb0, 0x23, 0x02, 0x23, 0x9d, 0x4a, 0x3f, 0x3f, + 0x51, 0x44, 0x80, 0x18, 0x0d, 0x51, 0x80, 0x0f, 0x0b, 0x01, 0x0b, 0x9a, 0x00, 0x3f, 0x71, 0xed, + 0x3f, 0xed, 0x11, 0x39, 0x10, 0xcd, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0xed, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0x5d, 0xc5, 0xed, 0x10, 0xc6, 0x10, + 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x10, 0xfd, 0xd6, 0xed, 0x5d, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd4, + 0x87, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, + 0x16, 0x06, 0x23, 0x22, 0x26, 0x03, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, + 0x15, 0x23, 0x01, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, + 0x17, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x13, 0x01, 0x23, 0x01, 0x01, 0x0b, + 0x12, 0x15, 0x0e, 0x10, 0x13, 0x1e, 0x27, 0x14, 0x14, 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, + 0x01, 0x36, 0x40, 0x33, 0x41, 0x9b, 0x3f, 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, + 0x11, 0x2a, 0x13, 0x14, 0x0f, 0x06, 0x12, 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, + 0x60, 0x01, 0x36, 0x23, 0x18, 0x14, 0x18, 0x0f, 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, + 0x13, 0x0c, 0x0a, 0x15, 0x68, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, + 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, + 0x26, 0x02, 0x01, 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, + 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xfe, 0x15, 0x0c, 0x0c, 0x07, + 0x0b, 0x13, 0x0b, 0x0a, 0x09, 0x7c, 0x06, 0x0c, 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, 0x08, 0x07, + 0x01, 0xaa, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, 0xff, 0xf9, 0x01, 0xf5, + 0x02, 0x72, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x32, 0x00, 0x41, 0x00, 0x45, 0x00, 0xd6, 0x40, 0x15, + 0x3e, 0x40, 0x0f, 0x00, 0x4d, 0x3e, 0x20, 0x0c, 0x00, 0x4d, 0x3e, 0x40, 0x0b, 0x00, 0x4d, 0x3e, + 0x20, 0x09, 0x00, 0x4d, 0x3a, 0xb8, 0xff, 0xc0, 0xb4, 0x0e, 0x11, 0x00, 0x4c, 0x03, 0xb8, 0xff, + 0xe0, 0x40, 0x5c, 0x14, 0x00, 0x4d, 0x00, 0x40, 0x18, 0x00, 0x4d, 0x00, 0x40, 0x15, 0x16, 0x00, + 0x4c, 0xef, 0x00, 0x01, 0x43, 0x45, 0x44, 0x45, 0xaf, 0x42, 0x43, 0x14, 0x42, 0x43, 0x42, 0x47, + 0xaf, 0x00, 0xbf, 0x00, 0x02, 0x00, 0x7c, 0x20, 0x1b, 0x7c, 0x15, 0x06, 0x7c, 0x26, 0x2d, 0x7c, + 0x10, 0x15, 0x47, 0x44, 0x46, 0x38, 0x3c, 0x3a, 0x41, 0x8f, 0x33, 0xa0, 0x3a, 0xb0, 0x3a, 0x02, + 0x5f, 0x3a, 0x6f, 0x3a, 0x8f, 0x3a, 0x03, 0x3a, 0x46, 0x45, 0x04, 0x44, 0x0c, 0x43, 0x0c, 0x42, + 0x04, 0x30, 0x41, 0x60, 0x41, 0xb0, 0x41, 0x03, 0x41, 0x9c, 0x38, 0x81, 0x3b, 0x04, 0x29, 0xb8, + 0xff, 0xc0, 0x40, 0x13, 0x19, 0x1c, 0x48, 0x29, 0x80, 0x1e, 0x1e, 0x0b, 0x23, 0x80, 0x18, 0x0d, + 0x30, 0x80, 0x0f, 0x0b, 0x01, 0x0b, 0x9a, 0x00, 0x3f, 0x71, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x2f, + 0xed, 0x2b, 0x3f, 0xed, 0x3f, 0x5d, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0xd4, + 0xed, 0x10, 0xd5, 0xc5, 0x10, 0xc2, 0x10, 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x10, 0xfd, 0xd6, 0xed, + 0x5d, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x01, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, + 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, 0x17, 0x17, 0x36, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x25, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, + 0x25, 0x01, 0x23, 0x01, 0x01, 0x0b, 0x12, 0x15, 0x0e, 0x10, 0x13, 0x1e, 0x27, 0x14, 0x14, 0x27, + 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, 0x41, 0x9c, 0x23, 0x18, 0x14, 0x18, + 0x0f, 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, 0x13, 0x0c, 0x0a, 0x15, 0xfe, 0xd8, 0x06, + 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0x01, 0x2c, 0xfe, 0xc3, 0x64, + 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, + 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, 0x29, 0x0c, 0x0c, 0x07, 0x0b, 0x13, 0x0b, + 0x0a, 0x09, 0x7c, 0x06, 0x0c, 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, 0x08, 0x07, 0xb7, 0x22, 0x30, + 0x29, 0x26, 0x1a, 0x3f, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0xf3, 0xfd, 0x95, 0x02, 0x6b, 0x00, + 0x00, 0x03, 0x00, 0x02, 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x0a, 0x00, 0x2b, 0x00, 0x2f, + 0x00, 0xa6, 0xb9, 0x00, 0x17, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xc0, 0xb3, + 0x1c, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xe0, 0x40, 0x58, 0x19, 0x1b, 0x00, 0x4c, 0x44, 0x17, 0x54, + 0x17, 0x02, 0x2d, 0x2f, 0x2e, 0x2f, 0xaf, 0x2c, 0x2d, 0x14, 0x2c, 0x2d, 0x2c, 0x31, 0x29, 0x2a, + 0x1d, 0x7c, 0x0e, 0x31, 0x2e, 0x30, 0x2b, 0x82, 0x9f, 0x23, 0x01, 0x23, 0x6f, 0x16, 0x01, 0x16, + 0x30, 0x90, 0x05, 0x01, 0x05, 0x8f, 0x06, 0x00, 0x30, 0x2f, 0x04, 0x2e, 0x0c, 0x2d, 0x0c, 0x2c, + 0x04, 0x22, 0x80, 0x0b, 0x0b, 0x13, 0x2b, 0x81, 0x29, 0x9a, 0x1a, 0x80, 0x13, 0x0c, 0x00, 0x07, + 0x0a, 0x0a, 0x07, 0x00, 0x03, 0x04, 0x30, 0x05, 0x60, 0x05, 0xb0, 0x05, 0x03, 0x05, 0x9c, 0x04, + 0x04, 0x00, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x3f, 0xed, 0x3f, 0xed, 0x11, + 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd4, 0xed, 0x5d, 0x10, 0xd4, 0x5d, + 0xd4, 0x5d, 0xed, 0x10, 0xc2, 0x10, 0xd0, 0xed, 0xd4, 0xc0, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, + 0xc4, 0x31, 0x30, 0x00, 0x71, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, + 0x06, 0x06, 0x07, 0x01, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, + 0x13, 0x01, 0x23, 0x01, 0x02, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0x73, 0x3f, + 0x2d, 0x13, 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, 0x13, 0x14, 0x0e, 0x06, 0x12, + 0x21, 0x1a, 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0x3f, 0xfe, 0xc3, 0x64, 0x01, 0x3d, + 0x02, 0x2d, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0xfe, 0xb7, 0x06, 0x30, 0x24, 0x17, + 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, + 0x1f, 0x20, 0x15, 0x3f, 0x01, 0xaf, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x20, 0x00, 0x3e, 0x00, 0x42, 0x00, 0xf6, 0xb5, 0x32, + 0x40, 0x17, 0x00, 0x4d, 0x2d, 0xb8, 0xff, 0xa8, 0x40, 0x2f, 0x12, 0x00, 0x4d, 0x29, 0x20, 0x13, + 0x00, 0x4d, 0x22, 0x40, 0x1f, 0x00, 0x4d, 0x21, 0x40, 0x1f, 0x00, 0x4d, 0x32, 0x20, 0x17, 0x00, + 0x4d, 0x32, 0x20, 0x12, 0x00, 0x4d, 0x18, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x17, 0x40, 0x19, 0x1a, + 0x00, 0x4c, 0x16, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x20, 0x00, 0x4d, + 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x13, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0xb3, 0x12, 0x00, 0x4d, + 0x0c, 0xb8, 0xff, 0xe0, 0xb3, 0x1a, 0x1f, 0x48, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x53, 0x1b, 0x1c, + 0x00, 0x4c, 0x40, 0x42, 0x41, 0x42, 0xaf, 0x3f, 0x40, 0x14, 0x3f, 0x40, 0x3f, 0x44, 0x2d, 0x7c, + 0x39, 0x39, 0x43, 0x44, 0x1e, 0x12, 0x7c, 0x03, 0x44, 0x41, 0x43, 0x22, 0x23, 0x43, 0x20, 0x82, + 0x9f, 0x18, 0x01, 0x18, 0x6f, 0x0b, 0x01, 0x0b, 0x33, 0x43, 0x42, 0x04, 0x41, 0x0c, 0x40, 0x0c, + 0x3f, 0x04, 0x2f, 0x99, 0x36, 0x05, 0x21, 0x81, 0x30, 0x22, 0x01, 0x30, 0x22, 0x60, 0x22, 0xb0, + 0x22, 0x03, 0x22, 0x9c, 0x0c, 0x08, 0x20, 0x81, 0x1e, 0x9a, 0x0f, 0x80, 0x08, 0x0d, 0x17, 0x80, + 0x00, 0x00, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xc0, 0xd4, 0x5d, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0xc5, 0x10, + 0xc2, 0x10, 0xd0, 0xed, 0xc4, 0x11, 0x12, 0x39, 0x2f, 0xed, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, + 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, + 0x23, 0x27, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x25, 0x01, + 0x23, 0x01, 0x01, 0x88, 0x3f, 0x2d, 0x13, 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, + 0x13, 0x14, 0x0e, 0x06, 0x12, 0x21, 0x1a, 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0xb4, + 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, 0x10, 0x0c, 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, + 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, 0x01, 0x72, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xa9, 0x06, 0x30, + 0x24, 0x17, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, + 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xf9, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, + 0x0e, 0x0d, 0x16, 0x10, 0x0d, 0x36, 0x16, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, + 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x03, 0x00, 0x0c, 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x27, + 0x00, 0x48, 0x00, 0x4c, 0x00, 0xfe, 0xb9, 0x00, 0x34, 0xff, 0xe0, 0xb4, 0x1c, 0x20, 0x00, 0x4c, + 0x34, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x1a, 0x00, 0x4d, 0x04, 0x34, 0x24, 0x34, 0x02, 0x0c, 0xb8, + 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, 0x0c, 0xb8, + 0xff, 0xc0, 0xb4, 0x1a, 0x1b, 0x00, 0x4c, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1b, 0x00, 0x4c, + 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x58, 0x1a, 0x1b, 0x00, 0x4c, 0x4c, 0x4a, 0x49, 0x4a, 0xaf, 0x4b, + 0x4c, 0x14, 0x4b, 0x4b, 0x4c, 0x49, 0x4e, 0x46, 0x3a, 0x7c, 0x2b, 0x4e, 0x0e, 0x7c, 0x1b, 0x06, + 0x7c, 0x1f, 0x4e, 0x4b, 0x4d, 0x48, 0x82, 0x9f, 0x40, 0x01, 0x40, 0x6f, 0x33, 0x01, 0x33, 0x4d, + 0x15, 0x27, 0x4d, 0x4c, 0x04, 0x4b, 0x0c, 0x4a, 0x0c, 0x49, 0x04, 0x3f, 0x80, 0x28, 0x28, 0x30, + 0x48, 0x81, 0x46, 0x9a, 0x37, 0x80, 0x30, 0x0d, 0x0b, 0x81, 0x08, 0x1d, 0x08, 0x1d, 0x18, 0x03, + 0x80, 0x30, 0x24, 0x60, 0x24, 0xb0, 0x24, 0x03, 0x24, 0x9d, 0x11, 0x80, 0x18, 0x05, 0x00, 0x3f, + 0xed, 0x3f, 0x5d, 0xed, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0xed, + 0x11, 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd4, 0x5d, 0xd4, + 0x5d, 0xed, 0x10, 0xc6, 0x10, 0xdc, 0xed, 0xd4, 0xed, 0x10, 0xd0, 0xed, 0xc4, 0x10, 0xc4, 0x87, + 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x71, 0x2b, 0x2b, 0x13, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x05, 0x16, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, 0x13, 0x01, 0x23, 0x01, 0x1e, 0x0b, 0x27, 0x14, + 0x17, 0x17, 0x3b, 0x14, 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x28, 0x09, 0x16, 0x0e, 0x38, 0x1e, + 0x34, 0x30, 0x1e, 0x2a, 0x13, 0x22, 0x2d, 0x1b, 0x1c, 0x33, 0x10, 0x01, 0x7c, 0x3f, 0x2d, 0x13, + 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, 0x13, 0x14, 0x0e, 0x06, 0x12, 0x21, 0x1a, + 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0x51, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbd, + 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, + 0x1a, 0x25, 0x13, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0xd7, 0x06, 0x30, 0x24, 0x17, + 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, + 0x1f, 0x20, 0x15, 0x3f, 0x01, 0xaf, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x36, 0x00, 0xb9, + 0xb6, 0x32, 0x40, 0x13, 0x14, 0x00, 0x4c, 0x30, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x12, 0x00, 0x4d, + 0x0c, 0x20, 0x17, 0x18, 0x00, 0x4c, 0x0b, 0x40, 0x17, 0x1c, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xe0, + 0xb4, 0x1a, 0x20, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xe8, 0x40, 0x53, 0x19, 0x00, 0x4d, 0x36, 0x34, + 0x33, 0x34, 0xaf, 0x35, 0x36, 0x14, 0x35, 0x35, 0x36, 0x33, 0x1e, 0x38, 0x35, 0x37, 0x25, 0x3f, + 0x22, 0x01, 0x22, 0x28, 0x32, 0x32, 0x31, 0x2d, 0x2a, 0x37, 0x20, 0x82, 0x18, 0x6f, 0x0b, 0x01, + 0x0b, 0x37, 0x12, 0x7c, 0x03, 0x36, 0x04, 0x35, 0x0c, 0x34, 0x0c, 0x33, 0x04, 0x22, 0x32, 0x80, + 0x28, 0x30, 0x26, 0x01, 0x30, 0x26, 0x60, 0x26, 0x90, 0x26, 0xb0, 0x26, 0x04, 0x26, 0x9c, 0x21, + 0x04, 0x17, 0x80, 0x00, 0x00, 0x08, 0x20, 0x81, 0x1e, 0x9a, 0x0f, 0x80, 0x08, 0x0d, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x11, 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x5d, 0x71, 0xd5, 0xed, 0x32, 0x3f, 0x3f, + 0x3f, 0x3f, 0x01, 0x2f, 0xed, 0x10, 0xd4, 0x5d, 0xd4, 0xed, 0x10, 0xd0, 0xc5, 0xd1, 0xc2, 0x2f, + 0x32, 0xc5, 0x5d, 0x32, 0x10, 0xc6, 0x10, 0xc4, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, + 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, 0x03, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, + 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, 0x25, 0x01, 0x23, 0x01, 0x01, 0x88, 0x3f, 0x2d, + 0x13, 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, 0x13, 0x14, 0x0e, 0x06, 0x12, 0x21, + 0x1a, 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0xbe, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, + 0x20, 0x18, 0x0f, 0x19, 0x0b, 0x33, 0x01, 0x65, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xa9, 0x06, 0x30, + 0x24, 0x17, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, + 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0x01, 0xb6, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, + 0x40, 0x17, 0x29, 0x14, 0x8d, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, + 0xff, 0xf7, 0x01, 0xde, 0x02, 0x72, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x2c, 0x00, 0xa5, + 0x40, 0x0c, 0x1c, 0x40, 0x13, 0x15, 0x00, 0x4c, 0x28, 0x20, 0x13, 0x00, 0x4d, 0x07, 0xb8, 0xff, + 0xc0, 0x40, 0x3b, 0x1a, 0x1b, 0x00, 0x4c, 0x2a, 0x2c, 0x2b, 0x2c, 0xaf, 0x29, 0x2a, 0x14, 0x29, + 0x2a, 0x29, 0x2e, 0x1c, 0x7c, 0x00, 0xa0, 0x09, 0xc0, 0x09, 0x02, 0x09, 0x2e, 0x2b, 0x2d, 0x23, + 0x8f, 0x24, 0x1e, 0x2d, 0x16, 0x7c, 0x8f, 0x0f, 0xbf, 0x0f, 0x02, 0x0f, 0x2d, 0x2c, 0x04, 0x2b, + 0x0c, 0x2a, 0x0c, 0x29, 0x04, 0x1e, 0x25, 0x28, 0x28, 0x25, 0x1e, 0x03, 0x21, 0x23, 0xb8, 0xff, + 0xc0, 0x40, 0x1c, 0x0c, 0x00, 0x4d, 0x60, 0x23, 0xb0, 0x23, 0x02, 0x23, 0x9c, 0x21, 0x04, 0x0f, + 0x13, 0x01, 0x13, 0x80, 0x06, 0x06, 0x0c, 0x00, 0x81, 0x12, 0x9a, 0x19, 0x80, 0x0c, 0x0b, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x71, 0x3f, 0x3f, 0x5d, 0x2b, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0xd4, 0xed, + 0x10, 0xc2, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0x87, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x25, 0x06, 0x06, 0x07, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x07, 0x22, 0x06, 0x07, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x01, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x25, 0x01, + 0x23, 0x01, 0x01, 0xd9, 0x30, 0x3d, 0x0f, 0x08, 0x0d, 0x06, 0x35, 0x31, 0x37, 0x34, 0x30, 0x3d, + 0x6b, 0x61, 0x5f, 0x0b, 0x11, 0x08, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0xfe, 0x6d, 0x22, 0x32, 0x18, + 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0xb2, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xbf, 0x03, 0x0a, 0x11, + 0x02, 0x02, 0x29, 0x27, 0x2a, 0x34, 0x34, 0x39, 0x52, 0x50, 0x03, 0x99, 0x03, 0x02, 0x20, 0x0f, + 0x0f, 0x0b, 0x1a, 0x01, 0xc3, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0x79, 0xfd, 0x95, + 0x02, 0x6b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0xff, 0xf7, 0x01, 0xde, 0x02, 0x72, 0x00, 0x12, + 0x00, 0x33, 0x00, 0x3e, 0x00, 0x42, 0x00, 0xeb, 0x40, 0x0c, 0x3d, 0x40, 0x14, 0x15, 0x00, 0x4c, + 0x34, 0x40, 0x19, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe0, 0xb3, 0x21, 0x00, 0x4d, 0x1f, 0xb8, 0xff, + 0xc0, 0xb4, 0x1e, 0x1f, 0x00, 0x4c, 0x1f, 0xb8, 0xff, 0xc0, 0xb4, 0x1b, 0x1c, 0x00, 0x4c, 0x1f, + 0xb8, 0xff, 0xe0, 0x40, 0x0d, 0x1a, 0x00, 0x4d, 0x40, 0x1f, 0x01, 0x34, 0x1f, 0x01, 0x05, 0x1f, + 0x01, 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x6a, 0x1a, 0x00, 0x4d, 0x24, 0x13, 0x34, 0x13, 0x02, 0x42, + 0x40, 0x3f, 0x40, 0xaf, 0x41, 0x42, 0x14, 0x41, 0x41, 0x42, 0x3f, 0x44, 0x25, 0x7c, 0x16, 0x31, + 0x44, 0x3d, 0x7c, 0x00, 0x09, 0x40, 0x0c, 0x00, 0x4d, 0xbf, 0x09, 0xdf, 0x09, 0x02, 0x09, 0x44, + 0x41, 0x43, 0x33, 0x82, 0x30, 0x1e, 0x43, 0x37, 0x7c, 0xbf, 0x0f, 0x01, 0x0f, 0x43, 0x42, 0x04, + 0x41, 0x0c, 0x40, 0x0c, 0x3f, 0x04, 0x2b, 0x2b, 0x81, 0x13, 0x33, 0x81, 0x31, 0x04, 0x22, 0x80, + 0x20, 0x1b, 0x30, 0x1b, 0x40, 0x1b, 0x03, 0x30, 0x1b, 0x60, 0x1b, 0x90, 0x1b, 0xb0, 0x1b, 0xe0, + 0x1b, 0x05, 0x1b, 0x9d, 0x34, 0x80, 0x06, 0x06, 0x0c, 0x00, 0x81, 0x12, 0x9a, 0x3a, 0x80, 0x0c, + 0x0b, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x10, 0xed, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xfd, + 0xd2, 0xe9, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0xd6, 0xed, + 0x10, 0xc6, 0x10, 0xde, 0x5d, 0x2b, 0xc4, 0xed, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x87, 0x10, + 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x71, 0x2b, 0x71, 0x71, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x25, 0x06, 0x06, 0x07, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, + 0x33, 0x15, 0x23, 0x01, 0x22, 0x06, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x13, 0x01, + 0x23, 0x01, 0x01, 0xd9, 0x30, 0x3d, 0x0f, 0x08, 0x0d, 0x06, 0x35, 0x31, 0x37, 0x34, 0x30, 0x3d, + 0x6b, 0x61, 0xfe, 0x9e, 0x3f, 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, 0x11, 0x2a, + 0x13, 0x14, 0x0f, 0x06, 0x12, 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, 0x60, 0x01, + 0x02, 0x0b, 0x11, 0x08, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0x3b, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xbf, + 0x03, 0x0a, 0x11, 0x02, 0x02, 0x29, 0x27, 0x2a, 0x34, 0x34, 0x39, 0x52, 0x50, 0x03, 0x01, 0x1d, + 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, + 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xfe, 0x37, 0x03, 0x02, 0x20, 0x0f, 0x0f, 0x0b, + 0x1a, 0x02, 0x01, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x01, 0xf4, + 0x02, 0x72, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x92, 0x40, 0x5e, 0x16, 0x40, 0x0f, 0x00, + 0x4d, 0x16, 0x40, 0x0c, 0x00, 0x4d, 0x12, 0x40, 0x15, 0x00, 0x4d, 0x11, 0x40, 0x15, 0x00, 0x4d, + 0x10, 0x40, 0x12, 0x00, 0x4d, 0x0a, 0x20, 0x13, 0x00, 0x4d, 0x1d, 0x1b, 0x1a, 0x1b, 0xaf, 0x1c, + 0x1d, 0x14, 0x1c, 0x1c, 0x1d, 0x1a, 0x1f, 0x10, 0x14, 0x1f, 0x1c, 0x1e, 0x19, 0x8f, 0x0b, 0x12, + 0x1e, 0x90, 0x05, 0x01, 0x05, 0x8f, 0x06, 0x00, 0x1e, 0x1d, 0x04, 0x1c, 0x0c, 0x1b, 0x0c, 0x1a, + 0x04, 0x10, 0x81, 0x12, 0x9b, 0x0b, 0x0c, 0x0a, 0x07, 0x00, 0x00, 0x07, 0x0a, 0x03, 0x03, 0x30, + 0x05, 0x60, 0x05, 0xb0, 0x05, 0x03, 0x05, 0x9c, 0x03, 0x04, 0x00, 0x3f, 0x3f, 0x5d, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x37, + 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, + 0x03, 0x07, 0x13, 0x01, 0x23, 0x01, 0x02, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, + 0x38, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0x31, 0xfe, 0xc3, + 0x64, 0x01, 0x3d, 0x02, 0x2d, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0xfe, 0x0e, 0x22, + 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0x02, 0x6b, 0xfd, 0x95, 0x02, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x0e, + 0x00, 0x2c, 0x00, 0x30, 0x00, 0x97, 0x40, 0x65, 0x18, 0x20, 0x13, 0x00, 0x4d, 0x17, 0x20, 0x13, + 0x00, 0x4d, 0x0b, 0x40, 0x0f, 0x00, 0x4d, 0x0b, 0x40, 0x0c, 0x00, 0x4d, 0x07, 0x40, 0x1b, 0x00, + 0x4d, 0x07, 0x40, 0x18, 0x00, 0x4d, 0x06, 0x40, 0x1b, 0x00, 0x4d, 0x06, 0x40, 0x18, 0x00, 0x4d, + 0x30, 0x2e, 0x2d, 0x2e, 0xaf, 0x2f, 0x30, 0x14, 0x2f, 0x2f, 0x30, 0x2d, 0x32, 0x05, 0x08, 0x32, + 0x2f, 0x31, 0x1b, 0x7c, 0x27, 0x10, 0x21, 0x11, 0x31, 0x0e, 0x8f, 0x00, 0x07, 0x31, 0x30, 0x04, + 0x2f, 0x0c, 0x2e, 0x0c, 0x2d, 0x04, 0x1d, 0x99, 0x24, 0x05, 0x0f, 0x81, 0x30, 0x10, 0x60, 0x10, + 0xb0, 0x10, 0xe0, 0x10, 0x04, 0x10, 0x9c, 0x05, 0x81, 0x07, 0x9b, 0x00, 0x0c, 0x00, 0x3f, 0x3f, + 0xe5, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xd4, 0xed, 0x10, + 0xd6, 0xc4, 0xd5, 0xd4, 0xed, 0x10, 0xc6, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x3e, 0x03, + 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, 0x03, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, + 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0x4d, 0x06, 0x0c, 0x0f, 0x17, 0x12, + 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0xc9, 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, 0x10, 0x0c, + 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, 0x01, 0x6e, + 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, + 0x25, 0x01, 0xb5, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, 0x0e, 0x0d, 0x16, 0x10, + 0x0d, 0x36, 0x16, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, 0xfd, 0x95, 0x02, 0x6b, + 0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x27, 0x00, 0x36, 0x00, 0x3a, + 0x00, 0xcc, 0x40, 0x15, 0x33, 0x40, 0x0f, 0x00, 0x4d, 0x33, 0x20, 0x0c, 0x00, 0x4d, 0x2f, 0x40, + 0x1b, 0x00, 0x4d, 0x2e, 0x40, 0x1b, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, + 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x5f, 0x1a, 0x00, + 0x4d, 0x3a, 0x38, 0x37, 0x38, 0xaf, 0x39, 0x3a, 0x14, 0x39, 0x39, 0x3a, 0x37, 0x3c, 0x2d, 0x31, + 0x3c, 0x0e, 0x7c, 0x1b, 0x06, 0x7c, 0x1f, 0x20, 0x1f, 0x30, 0x1f, 0x80, 0x1f, 0x03, 0xa0, 0x1f, + 0xb0, 0x1f, 0xe0, 0x1f, 0xf0, 0x1f, 0x04, 0x1b, 0x1f, 0x1b, 0x1f, 0x3c, 0x39, 0x3b, 0x36, 0x8f, + 0x28, 0x2f, 0x3b, 0x15, 0x27, 0x3b, 0x3a, 0x04, 0x39, 0x0c, 0x38, 0x0c, 0x37, 0x04, 0x36, 0x0c, + 0x2d, 0x81, 0x2f, 0x9b, 0x0b, 0x81, 0x08, 0x1d, 0x1d, 0x08, 0x18, 0x03, 0x80, 0x30, 0x24, 0x01, + 0x30, 0x24, 0x60, 0x24, 0xb0, 0x24, 0x03, 0x24, 0x9d, 0x11, 0x81, 0x18, 0x05, 0x00, 0x3f, 0xed, + 0x3f, 0x5d, 0x71, 0xed, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x5d, 0x71, 0x10, 0xed, 0x10, 0xed, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, + 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, + 0x13, 0x01, 0x23, 0x01, 0x1e, 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3b, 0x14, 0x16, 0x1a, 0x13, 0x0f, + 0x0b, 0x11, 0x28, 0x09, 0x16, 0x0e, 0x38, 0x1e, 0x34, 0x30, 0x1e, 0x2a, 0x13, 0x22, 0x2d, 0x1b, + 0x1c, 0x33, 0x10, 0x01, 0x41, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, + 0x06, 0x33, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbd, 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, 0x0a, + 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, 0x1a, 0x25, 0x13, 0x14, 0x2b, 0x17, 0x1e, + 0x13, 0x08, 0x09, 0x08, 0xfe, 0x80, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, + 0x34, 0x25, 0x02, 0x6b, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x02, 0x72, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x20, 0x00, 0x24, 0x00, 0xb5, 0xb6, 0x20, 0x40, 0x13, + 0x14, 0x00, 0x4c, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x6e, 0x12, 0x00, 0x4d, 0x0b, 0x40, 0x0f, 0x00, + 0x4d, 0x0b, 0x20, 0x0c, 0x00, 0x4d, 0x07, 0x40, 0x17, 0x00, 0x4d, 0x07, 0x40, 0x15, 0x00, 0x4d, + 0x06, 0x40, 0x17, 0x00, 0x4d, 0x06, 0x40, 0x15, 0x00, 0x4d, 0x24, 0x22, 0x21, 0x22, 0xaf, 0x23, + 0x24, 0x14, 0x23, 0x23, 0x24, 0x21, 0x26, 0x05, 0x09, 0x26, 0x23, 0x25, 0x13, 0xc0, 0x12, 0x01, + 0x12, 0xd0, 0x10, 0x01, 0x10, 0x16, 0x20, 0x20, 0x1f, 0x1b, 0x17, 0x25, 0x0e, 0x8f, 0x00, 0x2f, + 0x07, 0x01, 0x07, 0x25, 0x24, 0x04, 0x23, 0x0c, 0x22, 0x0c, 0x21, 0x04, 0x10, 0x20, 0x81, 0x16, + 0x30, 0x14, 0x60, 0x14, 0x90, 0x14, 0xb0, 0x14, 0x04, 0x14, 0x9c, 0x1c, 0x81, 0x0f, 0x04, 0x0e, + 0x0c, 0x08, 0x9b, 0x05, 0x81, 0x07, 0x9b, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x5d, + 0xd5, 0xed, 0x32, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0x71, 0xd4, 0xed, 0x10, 0xd0, 0xc5, + 0xd1, 0xc2, 0x2f, 0x32, 0xd5, 0x5d, 0xc5, 0x5d, 0x33, 0x10, 0xc6, 0x10, 0xd0, 0xc5, 0x10, 0xc4, + 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x21, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, 0x03, 0x15, 0x33, 0x15, + 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, 0x25, 0x01, + 0x23, 0x01, 0x01, 0x4d, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, + 0xd3, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, 0x20, 0x18, 0x0f, 0x19, 0x0b, 0x33, 0x01, 0x5f, 0xfe, + 0xc3, 0x64, 0x01, 0x3d, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, + 0x02, 0x72, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, 0x40, 0x17, 0x29, 0x14, 0x8d, 0xfd, + 0x95, 0x02, 0x6b, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x20, + 0x00, 0x2f, 0x00, 0x33, 0x00, 0xc2, 0x40, 0x0b, 0x2c, 0x40, 0x0f, 0x00, 0x4d, 0x2c, 0x20, 0x0c, + 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe8, 0xb3, 0x1f, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0xb3, 0x1d, + 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x1a, 0x00, 0x4d, 0x24, 0x0c, 0x34, 0x0c, 0x02, + 0x00, 0xb8, 0xff, 0xc8, 0xb3, 0x1f, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1d, 0x00, + 0x4c, 0x00, 0xb8, 0xff, 0xf0, 0x40, 0x49, 0x14, 0x00, 0x4d, 0x33, 0x31, 0x30, 0x31, 0xaf, 0x32, + 0x33, 0x14, 0x32, 0x32, 0x33, 0x30, 0x35, 0x26, 0x2a, 0x35, 0x12, 0x7c, 0x03, 0x1e, 0x35, 0x32, + 0x34, 0x2f, 0x8f, 0x21, 0x28, 0x34, 0x20, 0x82, 0x1d, 0x0b, 0x34, 0x33, 0x04, 0x32, 0x0c, 0x31, + 0x0c, 0x30, 0x04, 0x2f, 0x0c, 0x29, 0x9b, 0x26, 0x81, 0x28, 0x9b, 0x20, 0x81, 0x1e, 0x04, 0x0f, + 0x80, 0x30, 0x08, 0x01, 0x30, 0x08, 0x60, 0x08, 0xb0, 0x08, 0x03, 0x08, 0x9d, 0x18, 0x81, 0x00, + 0x00, 0x2f, 0xed, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x10, 0xd4, 0xd4, 0xed, + 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, + 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, + 0x03, 0x37, 0x33, 0x15, 0x23, 0x13, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, + 0x13, 0x01, 0x23, 0x01, 0x70, 0x3f, 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, 0x11, + 0x2a, 0x13, 0x14, 0x0f, 0x06, 0x12, 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, 0x60, + 0xdc, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0x33, 0xfe, 0xc3, + 0x64, 0x01, 0x3d, 0x02, 0x20, 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, + 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xfd, 0xcd, 0x22, + 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0x02, 0x6b, 0xfd, 0x95, 0x02, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x7b, 0x00, 0x13, + 0x00, 0x22, 0x00, 0x2d, 0x00, 0x31, 0x00, 0xb2, 0x40, 0x24, 0x2c, 0x40, 0x14, 0x00, 0x4d, 0x1f, + 0x40, 0x0f, 0x00, 0x4d, 0x1f, 0x20, 0x0c, 0x00, 0x4d, 0x1b, 0x40, 0x17, 0x00, 0x4d, 0x1b, 0x40, + 0x15, 0x00, 0x4d, 0x1a, 0x40, 0x17, 0x00, 0x4d, 0x1a, 0x40, 0x15, 0x00, 0x4d, 0x07, 0xb8, 0xff, + 0xc0, 0x40, 0x4e, 0x19, 0x1d, 0x00, 0x4c, 0x31, 0x2f, 0x2e, 0x2f, 0xaf, 0x30, 0x31, 0x14, 0x30, + 0x30, 0x31, 0x2e, 0x33, 0x19, 0x1d, 0x33, 0x2c, 0x7c, 0x09, 0x00, 0x33, 0x30, 0x32, 0x22, 0x8f, + 0x14, 0x1b, 0x32, 0x26, 0x7c, 0xef, 0x0f, 0x01, 0x0f, 0x32, 0x31, 0x04, 0x30, 0x0c, 0x2f, 0x0c, + 0x2e, 0x04, 0x1c, 0x9b, 0x19, 0x81, 0x1b, 0x9b, 0x14, 0x0c, 0x23, 0x80, 0x06, 0x06, 0x0c, 0x00, + 0x80, 0x13, 0x05, 0x29, 0x80, 0x30, 0x0c, 0x01, 0x30, 0x0c, 0x60, 0x0c, 0xb0, 0x0c, 0x03, 0x0c, + 0x9d, 0x00, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x10, + 0xd4, 0xd4, 0xed, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x06, 0x06, 0x07, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x13, 0x3e, + 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, 0x01, 0x22, 0x06, 0x07, 0x16, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x25, 0x01, 0x23, 0x01, 0xdd, 0x31, 0x3d, 0x0f, 0x08, 0x0d, 0x06, 0x35, + 0x31, 0x36, 0x34, 0x30, 0x3e, 0x65, 0x5c, 0x0b, 0x78, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, + 0x18, 0x1c, 0x11, 0x0a, 0x06, 0xfe, 0xd7, 0x0b, 0x11, 0x08, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0x01, + 0x3a, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x02, 0x37, 0x03, 0x0a, 0x11, 0x02, 0x02, 0x29, 0x27, 0x2a, + 0x34, 0x34, 0x39, 0x4f, 0x50, 0xfd, 0x85, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, + 0x2b, 0x34, 0x25, 0x01, 0xe2, 0x03, 0x02, 0x20, 0x0f, 0x0f, 0x0b, 0x1a, 0x89, 0xfd, 0x95, 0x02, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0xff, 0xf7, 0x01, 0xf0, 0x02, 0x72, 0x00, 0x12, + 0x00, 0x1d, 0x00, 0x27, 0x00, 0x2b, 0x00, 0xd6, 0xb9, 0x00, 0x26, 0xff, 0xc0, 0xb3, 0x14, 0x00, + 0x4d, 0x05, 0xb8, 0xff, 0x80, 0x40, 0x0a, 0x1b, 0x1c, 0x00, 0x4c, 0x05, 0xc0, 0x1a, 0x00, 0x4d, + 0x20, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, + 0x1e, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x19, 0x00, 0x4d, 0x1d, 0x20, 0x13, 0x00, 0x4d, 0x05, 0x40, + 0x1c, 0x00, 0x4d, 0x2f, 0x05, 0x01, 0x01, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, + 0xff, 0xc0, 0x40, 0x4d, 0x19, 0x00, 0x4d, 0x2b, 0x29, 0x28, 0x29, 0xaf, 0x2a, 0x2b, 0x14, 0x2a, + 0x2a, 0x2b, 0x28, 0x2d, 0x20, 0x7c, 0x03, 0x7c, 0x0f, 0x2d, 0x2a, 0x2c, 0x90, 0x18, 0x01, 0x18, + 0x8f, 0x19, 0x13, 0x2c, 0x26, 0x7c, 0x00, 0x07, 0x2c, 0x2b, 0x04, 0x2a, 0x0c, 0x29, 0x0c, 0x28, + 0x04, 0x1d, 0x1a, 0x13, 0x13, 0x1a, 0x1d, 0x03, 0x16, 0x30, 0x18, 0x60, 0x18, 0xb0, 0x18, 0x03, + 0x18, 0x9c, 0x16, 0x04, 0x1e, 0x80, 0x05, 0x05, 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x23, 0x80, 0x0a, + 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xc6, 0x10, 0xd6, 0xed, 0xed, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x25, 0x36, + 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, + 0x01, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x32, 0x37, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x13, 0x01, 0x23, 0x01, 0x01, 0x1c, 0x30, 0x3d, 0x0e, 0x0e, 0x0c, + 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, 0x66, 0x67, 0xfe, 0xdf, 0x22, 0x32, 0x18, 0x3f, 0x55, + 0x14, 0x1c, 0x13, 0x01, 0x6e, 0x12, 0x11, 0x01, 0x1a, 0x0e, 0x0e, 0x0e, 0x5f, 0xfe, 0xc3, 0x64, + 0x01, 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x50, 0x2a, 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, + 0x02, 0x36, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0xfe, 0x9e, 0x05, 0x1f, 0x10, 0x0f, + 0x0b, 0x1a, 0x01, 0xdb, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x04, 0x00, 0x00, 0xff, 0xf7, 0x01, 0xf0, + 0x02, 0x79, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x3e, 0x00, 0xc8, 0x40, 0x0b, 0x26, 0x20, + 0x13, 0x00, 0x4d, 0x25, 0x20, 0x13, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x14, 0x00, + 0x4d, 0x2e, 0x40, 0x17, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x14, 0xb8, + 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x01, 0xb8, + 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x4d, 0x19, 0x00, 0x4d, 0x3e, + 0x3c, 0x3b, 0x3c, 0xaf, 0x3d, 0x3e, 0x14, 0x3d, 0x3d, 0x3e, 0x3b, 0x40, 0x15, 0x7c, 0x03, 0x7c, + 0x0f, 0x60, 0x1e, 0x01, 0x1e, 0x40, 0x3d, 0x3f, 0x2f, 0x1f, 0x3f, 0x1b, 0x7c, 0x00, 0xef, 0x07, + 0x01, 0x07, 0x3f, 0x29, 0x7c, 0x35, 0x1d, 0x3e, 0x04, 0x3d, 0x0c, 0x3c, 0x0c, 0x3b, 0x04, 0x2b, + 0x99, 0x32, 0x05, 0x1d, 0x81, 0x30, 0x1e, 0x60, 0x1e, 0x02, 0x1e, 0x9c, 0x13, 0x80, 0x05, 0x05, + 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x18, 0x80, 0x0a, 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, + 0x10, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x2f, 0xd6, 0xed, 0x10, + 0xd4, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0xc4, 0x10, 0xc6, 0x10, 0xc4, 0x5d, 0xd6, 0xed, 0xed, 0x10, + 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x37, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x03, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x25, 0x01, 0x23, + 0x01, 0x01, 0x1c, 0x30, 0x3d, 0x0e, 0x0e, 0x0c, 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, 0x66, + 0x67, 0x60, 0x12, 0x11, 0x01, 0x1a, 0x0e, 0x0e, 0x0e, 0x8b, 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, + 0x10, 0x0c, 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, + 0x01, 0x69, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x50, 0x2a, 0x34, 0x0d, + 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x99, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0x25, 0x3f, 0x06, + 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, 0x0e, 0x0d, 0x16, 0x10, 0x0d, 0x36, 0x16, 0x17, 0x28, + 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x05, 0x00, 0x00, + 0xff, 0xf7, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x2f, 0x00, 0x33, + 0x00, 0xdf, 0xb9, 0x00, 0x1c, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x26, 0xb8, 0xff, 0xc0, 0xb3, + 0x0c, 0x00, 0x4d, 0x25, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0xb3, + 0x0c, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xa0, 0xb3, 0x19, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb3, + 0x19, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x19, 0x00, 0x4d, 0x06, 0x40, 0x1c, 0x00, + 0x4d, 0x05, 0x18, 0x19, 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, + 0xff, 0xc0, 0x40, 0x4d, 0x19, 0x00, 0x4d, 0x33, 0x31, 0x30, 0x31, 0xaf, 0x32, 0x33, 0x14, 0x32, + 0x32, 0x33, 0x30, 0x35, 0x16, 0x7c, 0x03, 0x7c, 0x10, 0x35, 0x32, 0x34, 0x22, 0x20, 0x1f, 0x25, + 0x2f, 0x2e, 0x2a, 0x26, 0x34, 0x1c, 0x7c, 0x00, 0x08, 0x34, 0x33, 0x04, 0x32, 0x0c, 0x31, 0x0c, + 0x30, 0x04, 0x1f, 0x2f, 0x81, 0x22, 0x25, 0x60, 0x23, 0x90, 0x23, 0xb0, 0x23, 0x03, 0x23, 0x9c, + 0x2b, 0x81, 0x1e, 0x04, 0x14, 0x80, 0x05, 0x05, 0x0b, 0x00, 0x80, 0x13, 0x0b, 0x19, 0x80, 0x0b, + 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0xd5, 0x32, + 0xe5, 0x32, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd0, 0xc5, 0xd5, 0xd6, + 0xc0, 0xd5, 0xc5, 0xc0, 0x10, 0xc6, 0x10, 0xd0, 0xed, 0xed, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x06, 0x23, 0x37, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x03, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, + 0x25, 0x01, 0x23, 0x01, 0x01, 0x20, 0x31, 0x3c, 0x0f, 0x0e, 0x0c, 0x35, 0x31, 0x36, 0x34, 0x15, + 0x27, 0x1f, 0x13, 0x65, 0x67, 0x5f, 0x12, 0x12, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0x99, 0x24, 0x24, + 0x50, 0x7c, 0x17, 0x2d, 0x20, 0x18, 0x0f, 0x19, 0x0b, 0x33, 0x01, 0x5d, 0xfe, 0xc3, 0x64, 0x01, + 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x29, 0x27, 0x2a, 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, + 0x99, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0xe2, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, + 0x2f, 0x40, 0x17, 0x29, 0x14, 0x8d, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, + 0xff, 0xf7, 0x01, 0xf0, 0x02, 0x72, 0x00, 0x12, 0x00, 0x33, 0x00, 0x3d, 0x00, 0x41, 0x00, 0xe1, + 0xb9, 0x00, 0x35, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x34, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x24, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb4, 0x21, 0x22, + 0x00, 0x4c, 0x1f, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1e, 0x00, 0x4c, 0x14, 0xb8, 0xff, 0xc0, 0xb3, + 0x1f, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0xb7, 0x1c, 0x1d, 0x00, 0x4c, 0x20, 0x14, 0x01, 0x13, + 0xb8, 0xff, 0xc0, 0x40, 0x5b, 0x1a, 0x00, 0x4d, 0x14, 0x03, 0x01, 0x41, 0x3f, 0x3e, 0x3f, 0xaf, + 0x40, 0x41, 0x14, 0x40, 0x40, 0x41, 0x3e, 0x43, 0x25, 0x7c, 0x16, 0x31, 0x43, 0x03, 0x36, 0x7c, + 0xe0, 0x0f, 0x01, 0x0f, 0x43, 0x40, 0x42, 0x33, 0x82, 0x30, 0x1e, 0x42, 0x3c, 0x7c, 0x00, 0x07, + 0x42, 0x41, 0x04, 0x40, 0x0c, 0x3f, 0x0c, 0x3e, 0x04, 0x2a, 0x81, 0x13, 0x13, 0x1b, 0x33, 0x81, + 0x31, 0x04, 0x22, 0x81, 0x30, 0x1b, 0x01, 0x0f, 0x1b, 0x01, 0x30, 0x1b, 0x60, 0x1b, 0xb0, 0x1b, + 0x03, 0x1b, 0x9d, 0x34, 0x80, 0x05, 0x05, 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x39, 0x7f, 0x0a, 0x9a, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x5d, 0x71, 0x71, 0xed, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd6, 0xd6, + 0xed, 0x10, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc4, 0x87, 0x10, + 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x71, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x06, 0x23, 0x03, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, + 0x01, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x13, 0x01, 0x23, 0x01, 0x01, 0x1c, + 0x30, 0x3d, 0x0e, 0x0e, 0x0c, 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, 0x66, 0x67, 0xb3, 0x3f, + 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, 0x11, 0x2a, 0x13, 0x14, 0x0f, 0x06, 0x12, + 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, 0x60, 0x01, 0x12, 0x12, 0x11, 0x01, 0x1a, + 0x0e, 0x0e, 0x0e, 0x69, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x50, 0x2a, + 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x02, 0x29, 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, + 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, + 0x3f, 0xfe, 0x5d, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0xdb, 0xfd, 0x95, 0x02, 0x6b, 0x00, + 0x00, 0x04, 0x00, 0x10, 0xff, 0xf7, 0x01, 0xde, 0x02, 0x72, 0x00, 0x12, 0x00, 0x21, 0x00, 0x2b, + 0x00, 0x2f, 0x00, 0xa3, 0x40, 0x0b, 0x1e, 0x40, 0x0f, 0x00, 0x4d, 0x1e, 0x20, 0x0c, 0x00, 0x4d, + 0x23, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, + 0x01, 0xb8, 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x44, 0x19, 0x00, + 0x4d, 0x2f, 0x2d, 0x2c, 0x2d, 0xaf, 0x2e, 0x2f, 0x14, 0x2e, 0x2e, 0x2f, 0x2c, 0x31, 0x03, 0x24, + 0x7c, 0x0f, 0x31, 0x2e, 0x30, 0x18, 0x1c, 0x1a, 0x21, 0x8f, 0x13, 0x1a, 0x30, 0x2a, 0x7c, 0x00, + 0x07, 0x30, 0x2f, 0x04, 0x2e, 0x0c, 0x2d, 0x0c, 0x2c, 0x04, 0x30, 0x21, 0x60, 0x21, 0x02, 0x21, + 0x9c, 0x18, 0x81, 0x1b, 0x04, 0x22, 0x80, 0x05, 0x05, 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x27, 0x80, + 0x0a, 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0x3f, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd6, 0xd4, 0xed, 0x10, 0xd5, 0xc5, 0x10, + 0xc6, 0x10, 0xd6, 0xfd, 0xc5, 0x10, 0xc6, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x03, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, + 0x15, 0x0e, 0x03, 0x07, 0x17, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x13, 0x01, + 0x23, 0x01, 0x01, 0x0a, 0x30, 0x3d, 0x0e, 0x0e, 0x0c, 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, + 0x66, 0x67, 0xd8, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0xe6, + 0x12, 0x12, 0x02, 0x1a, 0x0e, 0x0d, 0x0f, 0x62, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3b, 0x03, 0x09, + 0x11, 0x03, 0x50, 0x2a, 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x01, 0x81, 0x22, 0x30, 0x29, + 0x26, 0x1a, 0x3f, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0xe8, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, + 0x01, 0xdb, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xff, 0xf7, 0x01, 0xf4, + 0x02, 0x79, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x39, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x53, 0x01, 0x66, + 0xb9, 0x00, 0x42, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x00, + 0x4d, 0x17, 0xb8, 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0xb3, 0x23, 0x00, + 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0xb4, 0x20, 0x21, 0x00, 0x4c, 0x16, 0xb8, 0xff, 0xc0, 0xb4, 0x15, + 0x17, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x23, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb4, + 0x20, 0x21, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0xb4, 0x15, 0x17, 0x00, 0x4c, 0x13, 0xb8, 0xff, + 0xe0, 0x40, 0x40, 0x17, 0x00, 0x4d, 0x4e, 0x40, 0x1f, 0x00, 0x4d, 0x4e, 0x40, 0x1c, 0x1d, 0x00, + 0x4c, 0x4e, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x2f, 0x4e, 0x01, 0x4d, 0x40, 0x1f, 0x00, 0x4d, 0x4d, + 0x40, 0x1c, 0x1d, 0x00, 0x4c, 0x4d, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x2f, 0x4d, 0x01, 0x4c, 0x40, + 0x1f, 0x00, 0x4d, 0x4c, 0x40, 0x1c, 0x1d, 0x00, 0x4c, 0x4c, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x2f, + 0x4c, 0x01, 0x3b, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x19, 0x00, 0x4d, 0x00, 0x3a, 0x01, 0x21, 0x40, + 0x1b, 0x00, 0x4d, 0x53, 0x51, 0x50, 0x51, 0xaf, 0x52, 0x53, 0x14, 0x52, 0x52, 0x53, 0x50, 0x55, + 0x1e, 0x3c, 0x7c, 0x2b, 0x55, 0x52, 0x54, 0x42, 0x7c, 0x1b, 0x23, 0x54, 0x15, 0xb8, 0xff, 0xc0, + 0xb3, 0x22, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x46, 0x18, 0x00, 0x4d, 0x6f, 0x15, 0x01, + 0x15, 0x7c, 0xa0, 0x2f, 0xb0, 0x2f, 0x02, 0x2f, 0x34, 0x7c, 0x00, 0x6f, 0x10, 0x01, 0x10, 0x7c, + 0x4a, 0x44, 0x7c, 0x06, 0x00, 0x54, 0x53, 0x04, 0x52, 0x0c, 0x51, 0x0c, 0x50, 0x04, 0x3a, 0x80, + 0x20, 0x20, 0x26, 0x1b, 0x80, 0x2e, 0x0c, 0x3f, 0x80, 0x26, 0x9a, 0x47, 0x80, 0x32, 0x32, 0x0b, + 0x37, 0x80, 0x30, 0x18, 0x01, 0x30, 0x18, 0x60, 0x18, 0x02, 0x18, 0x9d, 0x4d, 0x80, 0x0b, 0x05, + 0x00, 0x3f, 0xed, 0x3f, 0x5d, 0x71, 0xed, 0x12, 0x39, 0x10, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x12, + 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x71, 0x10, + 0xfd, 0xd6, 0x5d, 0xed, 0x71, 0x2b, 0x2b, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xc6, 0x10, 0xd0, 0xfd, + 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x71, 0x2b, 0x71, + 0x2b, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x11, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x01, + 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x23, 0x03, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x13, 0x32, 0x37, + 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x01, 0x14, 0x16, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x25, 0x01, 0x23, 0x01, 0x12, 0x15, 0x0e, 0x10, 0x13, 0x1e, 0x27, 0x14, 0x14, + 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, 0x41, 0x01, 0x20, 0x31, 0x3c, + 0x0f, 0x0e, 0x0c, 0x35, 0x31, 0x36, 0x34, 0x15, 0x27, 0x1f, 0x13, 0x65, 0x67, 0x8c, 0x23, 0x18, + 0x14, 0x18, 0x0f, 0x0f, 0x19, 0xeb, 0x12, 0x12, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0xfe, 0xf1, 0x12, + 0x19, 0x08, 0x0b, 0x13, 0x0c, 0x0a, 0x15, 0x01, 0x7b, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbb, + 0x0f, 0x21, 0x0c, 0x0a, 0x1c, 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, 0x11, 0x11, 0x1c, + 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, 0xfe, 0xa6, 0x03, 0x09, 0x11, 0x03, 0x29, 0x27, 0x2a, 0x34, + 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x01, 0xc8, 0x0b, 0x0c, 0x07, 0x0b, 0x13, 0x0b, 0x0a, 0x0a, + 0xfe, 0xdc, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0x9f, 0x06, 0x0d, 0x08, 0x06, 0x0c, 0x08, + 0x08, 0x08, 0x06, 0x33, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x02, 0x00, 0x1d, 0xff, 0xf5, 0x01, 0xc5, + 0x02, 0xb5, 0x00, 0x20, 0x00, 0x30, 0x00, 0x4f, 0x40, 0x32, 0x03, 0x40, 0x0d, 0x00, 0x4d, 0x02, + 0x40, 0x0d, 0x00, 0x4d, 0x01, 0x40, 0x0d, 0x00, 0x4d, 0x00, 0x40, 0x0d, 0x00, 0x4d, 0x2e, 0x64, + 0x1e, 0x64, 0x00, 0x0c, 0x10, 0x0c, 0x02, 0x0c, 0x32, 0x26, 0x64, 0x04, 0x16, 0x31, 0x1b, 0x74, + 0x21, 0x21, 0x07, 0x29, 0x74, 0x11, 0x07, 0x03, 0x00, 0x74, 0x07, 0x9f, 0x00, 0x3f, 0xfd, 0xc6, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x26, 0x26, 0x07, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, + 0x26, 0x26, 0xc0, 0x17, 0x2d, 0x1f, 0x10, 0x27, 0x3c, 0x1f, 0x4d, 0x60, 0x36, 0x13, 0x18, 0x37, + 0x5b, 0x42, 0x27, 0x45, 0x33, 0x1d, 0x1e, 0x38, 0x4f, 0x31, 0x1c, 0x2e, 0x15, 0x04, 0x4e, 0x0a, + 0x1d, 0x28, 0x1a, 0x0c, 0x2b, 0x23, 0x20, 0x2d, 0x1d, 0x0e, 0x02, 0x14, 0x36, 0x02, 0x4f, 0x08, + 0x0b, 0x5f, 0x10, 0x0a, 0x3b, 0x61, 0x7d, 0x42, 0x3f, 0x7f, 0x66, 0x41, 0x1d, 0x36, 0x4f, 0x33, + 0x39, 0x5f, 0x43, 0x25, 0x0d, 0x0d, 0x48, 0x57, 0xee, 0x1a, 0x2a, 0x35, 0x1c, 0x35, 0x38, 0x24, + 0x3e, 0x54, 0x30, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x40, 0xb5, 0x0e, 0x20, 0x13, 0x00, 0x4d, 0x09, 0xb8, + 0xff, 0xe0, 0x40, 0x1a, 0x13, 0x00, 0x4d, 0x01, 0x0a, 0x0f, 0x0d, 0x06, 0x10, 0x08, 0x08, 0x0f, + 0x04, 0x10, 0x03, 0x00, 0x0f, 0x07, 0x08, 0x04, 0x02, 0x0c, 0x0b, 0x48, 0x00, 0x08, 0x00, 0x3f, + 0xfd, 0xc0, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xc4, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, + 0x39, 0x12, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x33, 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, + 0x03, 0x06, 0x06, 0x07, 0x33, 0x26, 0x26, 0x09, 0x2c, 0x5a, 0x2a, 0x86, 0x2c, 0x57, 0x29, 0xf2, + 0x1a, 0x2c, 0x17, 0xb6, 0x17, 0x28, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, 0xb2, 0x01, 0xf3, + 0x5a, 0xc3, 0x70, 0x71, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0x9f, 0x01, 0xcb, + 0x02, 0x6b, 0x00, 0x07, 0x00, 0x28, 0x40, 0x0b, 0x00, 0x6e, 0x03, 0x04, 0x6e, 0xc0, 0x07, 0xd0, + 0x07, 0x02, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0d, 0x10, 0x48, 0x07, 0x08, 0x07, 0x02, 0x05, + 0x87, 0x00, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x01, 0x11, + 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0xcb, 0x7b, 0xad, 0x7b, 0x02, 0x6b, 0xfd, 0x34, 0x02, + 0x66, 0xfd, 0x9a, 0x02, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0x9f, 0x01, 0xd0, + 0x02, 0x6b, 0x00, 0x17, 0x00, 0x2f, 0x40, 0x17, 0x12, 0x07, 0x19, 0x00, 0x44, 0x0c, 0x60, 0x0f, + 0x01, 0x0f, 0x08, 0x18, 0x00, 0x00, 0x06, 0x12, 0x48, 0x10, 0x02, 0x06, 0x48, 0x08, 0x87, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, 0xc6, 0xd6, 0x5d, 0xd5, 0xed, + 0x10, 0xc6, 0xc6, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x36, 0x36, 0x37, + 0x26, 0x26, 0x27, 0x35, 0x21, 0x15, 0x21, 0x1e, 0x03, 0x01, 0x54, 0x14, 0x2c, 0x2c, 0x2b, 0x12, + 0x01, 0x25, 0xfe, 0x4f, 0x2c, 0x60, 0x2e, 0x2f, 0x5c, 0x2c, 0x01, 0xae, 0xfe, 0xe2, 0x13, 0x2a, + 0x2a, 0x29, 0x01, 0x0e, 0x1b, 0x43, 0x47, 0x46, 0x1f, 0x65, 0x47, 0x51, 0x9a, 0x40, 0x42, 0x8c, + 0x48, 0x44, 0x66, 0x1e, 0x41, 0x40, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x79, 0x00, 0x27, 0x00, 0x77, 0xb9, 0x00, 0x21, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x21, + 0xb8, 0xff, 0xc0, 0x40, 0x48, 0x0b, 0x0c, 0x00, 0x4c, 0x11, 0x40, 0x12, 0x00, 0x4d, 0x11, 0x40, + 0x0b, 0x0c, 0x00, 0x4c, 0x10, 0x40, 0x12, 0x00, 0x4d, 0x10, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x29, + 0x0e, 0x0a, 0x46, 0x0f, 0x10, 0x1f, 0x10, 0x02, 0x10, 0xaf, 0x14, 0xbf, 0x14, 0x02, 0x30, 0x14, + 0x01, 0x14, 0x00, 0x22, 0x10, 0x22, 0x02, 0x22, 0x1e, 0x46, 0x00, 0x24, 0x28, 0x25, 0x48, 0x23, + 0x08, 0x22, 0x08, 0x10, 0x08, 0x0d, 0x48, 0x0f, 0x08, 0x19, 0x4a, 0x05, 0x03, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0xc4, 0x5d, 0xd6, 0x5d, 0x5d, + 0xc4, 0x5d, 0xfd, 0xd6, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, 0x35, 0x36, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x17, 0x15, 0x23, 0x35, 0x33, 0x26, + 0x26, 0x0e, 0x29, 0x42, 0x55, 0x2d, 0x2c, 0x55, 0x43, 0x29, 0x24, 0x2a, 0x51, 0xd7, 0x22, 0x35, + 0x0b, 0x19, 0x2b, 0x20, 0x20, 0x2b, 0x1b, 0x0b, 0x31, 0x26, 0xd9, 0x54, 0x2a, 0x25, 0x01, 0x62, + 0x4b, 0x6a, 0x43, 0x1f, 0x1f, 0x43, 0x6a, 0x4b, 0x42, 0x7e, 0x3c, 0x66, 0x57, 0x29, 0x77, 0x50, + 0x27, 0x47, 0x38, 0x21, 0x21, 0x38, 0x47, 0x27, 0x50, 0x77, 0x29, 0x57, 0x66, 0x3c, 0x81, 0x00, + 0x00, 0x01, 0x00, 0x28, 0x00, 0xd4, 0x01, 0xcc, 0x01, 0x39, 0x00, 0x03, 0x00, 0x15, 0xb7, 0x01, + 0x05, 0x03, 0x04, 0x02, 0x55, 0x00, 0xa1, 0x00, 0x3f, 0xed, 0x01, 0x7c, 0x2f, 0x18, 0xc6, 0x10, + 0xce, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x28, 0x01, 0xa4, 0xfe, 0x5c, 0x01, 0x39, 0x65, 0x00, + 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, 0x02, 0x6b, 0x02, 0x06, 0x01, 0x6e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xa7, 0x00, 0xc5, 0x01, 0x4d, 0x01, 0x6a, 0x00, 0x0b, 0x00, 0x12, 0xb7, 0x00, + 0x71, 0x06, 0x0c, 0x03, 0x75, 0x09, 0xa2, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x31, 0x30, + 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x4d, 0x33, 0x20, + 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x01, 0x18, 0x27, 0x2c, 0x2c, 0x27, 0x26, 0x2c, 0x2c, 0x00, + 0x00, 0x01, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xec, 0x02, 0xbb, 0x00, 0x0c, 0x00, 0x46, 0x40, 0x29, + 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x09, 0x40, 0x0d, 0x00, 0x4d, 0x0c, 0x20, 0x1a, 0x00, 0x4d, 0x07, + 0x79, 0x08, 0x00, 0x06, 0x6e, 0x05, 0x00, 0x0d, 0x0c, 0x72, 0x00, 0x04, 0x0b, 0x00, 0x01, 0x01, + 0x00, 0x0b, 0x04, 0x04, 0x06, 0x07, 0x0d, 0x06, 0x10, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x10, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xd4, 0xed, 0x31, 0x30, 0x00, + 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x37, 0x16, 0x16, 0x17, 0x13, 0x33, 0x03, 0x23, 0x26, 0x26, 0x27, + 0x07, 0x09, 0xa3, 0x10, 0x26, 0x0e, 0x7e, 0x7e, 0xc2, 0x66, 0x14, 0x36, 0x16, 0x3c, 0x01, 0x40, + 0x36, 0x28, 0x68, 0x2c, 0x02, 0x01, 0xfd, 0x38, 0x42, 0x88, 0x35, 0x13, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x78, 0x01, 0xe6, 0x01, 0x95, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x3a, 0x00, 0x37, 0x40, 0x20, + 0x25, 0xa4, 0x06, 0x30, 0x0c, 0x01, 0x80, 0x0c, 0x90, 0x0c, 0x02, 0x0c, 0xa4, 0x3a, 0x33, 0xa4, + 0x15, 0x3b, 0x2a, 0xa5, 0x03, 0x09, 0xa5, 0x20, 0xa3, 0x10, 0xa5, 0x36, 0x30, 0xa5, 0x1a, 0xa3, + 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x3f, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xfd, 0x5d, + 0x71, 0xd6, 0xed, 0x31, 0x30, 0x25, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x0f, 0x02, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x37, 0x01, 0x2f, 0x0e, 0x18, 0x0e, + 0x15, 0x14, 0x13, 0x15, 0x1f, 0x19, 0x05, 0x2d, 0x14, 0x33, 0x24, 0x16, 0x2e, 0x25, 0x18, 0x18, + 0x25, 0x2e, 0x16, 0x24, 0x38, 0x0f, 0x14, 0x33, 0x24, 0x16, 0x2d, 0x26, 0x18, 0x18, 0x26, 0x2d, + 0x16, 0x24, 0x37, 0x45, 0x0e, 0x18, 0x0d, 0x16, 0x14, 0x13, 0x15, 0x0f, 0x1c, 0x0d, 0x05, 0xfa, + 0x15, 0x10, 0x1f, 0x13, 0x13, 0x1f, 0x2a, 0x08, 0x50, 0x1b, 0x24, 0x11, 0x23, 0x36, 0x25, 0x25, + 0x35, 0x23, 0x11, 0x29, 0x16, 0x1b, 0x24, 0x11, 0x23, 0x35, 0x25, 0x25, 0x36, 0x23, 0x11, 0x29, + 0x72, 0x15, 0x11, 0x1f, 0x13, 0x13, 0x1f, 0x13, 0x16, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, + 0xff, 0x5b, 0x01, 0xc4, 0x02, 0xb6, 0x00, 0x1b, 0x00, 0x4f, 0xb9, 0x00, 0x09, 0xff, 0xc0, 0xb3, + 0x19, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x19, 0x00, 0x4d, 0x90, 0x08, 0x01, 0x2f, + 0x08, 0x3f, 0x08, 0x02, 0x08, 0x1d, 0x0d, 0x51, 0x90, 0x00, 0x01, 0x0f, 0x00, 0x1f, 0x00, 0x02, + 0x00, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x0b, 0x0e, 0x48, 0x17, 0x1c, 0x18, 0x57, 0x11, 0x12, + 0x0a, 0x57, 0x03, 0xa6, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xd6, 0x5d, 0x5d, + 0xed, 0x10, 0xc6, 0x5d, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x32, 0x16, + 0x16, 0x17, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x23, 0x22, 0x22, 0x26, 0x26, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0xbc, 0x5b, 0x65, 0x01, 0x11, 0x16, 0x18, 0x08, 0x46, 0x26, 0x1f, + 0x5b, 0x65, 0x01, 0x11, 0x16, 0x18, 0x08, 0x46, 0x26, 0x1f, 0x01, 0xed, 0x61, 0x68, 0x01, 0x01, + 0x01, 0x6b, 0x2c, 0x24, 0xfe, 0x2c, 0x61, 0x68, 0x01, 0x01, 0x6d, 0x2c, 0x24, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x15, 0x00, 0x3e, 0x01, 0xe7, 0x01, 0xcf, 0x02, 0x36, 0x00, 0x61, 0x00, 0x6b, + 0x00, 0x06, 0x00, 0x61, 0x00, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf9, 0x01, 0xcc, + 0x02, 0x12, 0x00, 0x13, 0x00, 0x3d, 0x40, 0x25, 0x03, 0x04, 0x02, 0x07, 0x01, 0x08, 0x12, 0x0b, + 0x11, 0x0c, 0x0e, 0x0d, 0x0c, 0x14, 0x15, 0x10, 0x13, 0x14, 0x0c, 0x08, 0x0e, 0x0a, 0x72, 0x11, + 0x09, 0x12, 0x06, 0x72, 0x01, 0x4f, 0x04, 0x5f, 0x04, 0x02, 0x04, 0x02, 0xa7, 0x00, 0x3f, 0xd5, + 0x5d, 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xd6, 0xc0, 0x11, 0x12, 0x17, + 0x39, 0x31, 0x30, 0x13, 0x33, 0x37, 0x17, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x07, + 0x27, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x28, 0xf0, 0x40, 0x4b, 0x29, 0x52, 0x88, 0x31, 0xb9, + 0xef, 0x3f, 0x4b, 0x2a, 0x55, 0x8b, 0x31, 0xbc, 0x01, 0x9b, 0x77, 0x29, 0x4e, 0x66, 0x5d, 0x66, + 0x79, 0x29, 0x50, 0x66, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x01, 0xcf, + 0x02, 0x2e, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x47, 0x40, 0x29, 0x05, 0x20, 0x0a, 0x0b, 0x00, 0x4c, + 0x04, 0x02, 0x06, 0x08, 0x30, 0x07, 0x50, 0x07, 0x70, 0x07, 0x90, 0x07, 0x04, 0x07, 0x0b, 0x06, + 0x04, 0x05, 0x03, 0x08, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x40, 0x08, 0x01, 0x08, 0x72, 0x09, + 0x04, 0x01, 0xa8, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x11, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, 0x12, + 0x17, 0x39, 0x01, 0x18, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, 0xc4, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x13, + 0x25, 0x17, 0x05, 0x05, 0x07, 0x25, 0x07, 0x21, 0x15, 0x21, 0x2d, 0x01, 0x80, 0x22, 0xfe, 0xe8, + 0x01, 0x18, 0x22, 0xfe, 0x80, 0x01, 0x01, 0xa3, 0xfe, 0x5d, 0x01, 0x95, 0x99, 0x6c, 0x64, 0x64, + 0x6c, 0x99, 0xc1, 0x66, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x01, 0xcf, 0x02, 0x2d, 0x00, 0x06, + 0x00, 0x0a, 0x00, 0x56, 0xb9, 0x00, 0x05, 0xff, 0xe0, 0x40, 0x2f, 0x13, 0x14, 0x00, 0x4c, 0x01, + 0x20, 0x09, 0x0b, 0x00, 0x4c, 0x06, 0x04, 0x07, 0x00, 0x02, 0x09, 0x30, 0x07, 0x50, 0x07, 0x70, + 0x07, 0x90, 0x07, 0x04, 0x07, 0x0b, 0x00, 0x02, 0x01, 0x03, 0x07, 0x06, 0x04, 0x05, 0x03, 0x03, + 0x05, 0x40, 0x07, 0x01, 0x07, 0x72, 0x0a, 0x04, 0x05, 0xa8, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x11, + 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x17, 0x39, 0x01, 0x18, 0x10, 0xd6, 0x5d, 0xc5, 0xd0, + 0xc5, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x01, 0x05, 0x27, 0x25, 0x25, 0x37, + 0x05, 0x01, 0x21, 0x15, 0x21, 0x01, 0xcf, 0xfe, 0x80, 0x23, 0x01, 0x18, 0xfe, 0xe8, 0x23, 0x01, + 0x80, 0xfe, 0x5d, 0x01, 0xa3, 0xfe, 0x5d, 0x01, 0x26, 0x99, 0x6c, 0x64, 0x64, 0x6c, 0x98, 0xfe, + 0xd1, 0x66, 0x00, 0x00, 0x00, 0x02, 0x00, 0x19, 0xff, 0xf1, 0x01, 0xd9, 0x02, 0x7b, 0x00, 0x0d, + 0x00, 0x18, 0x00, 0x8c, 0x40, 0x0a, 0x70, 0x15, 0x01, 0x70, 0x11, 0x01, 0x70, 0x0e, 0x01, 0x0b, + 0xb8, 0xff, 0xe0, 0xb3, 0x17, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xf8, 0x40, 0x3f, 0x0b, 0x00, 0x4d, 0x66, 0x0b, 0x01, 0x05, 0x20, 0x17, 0x00, 0x4d, + 0x05, 0x18, 0x0c, 0x00, 0x4d, 0x05, 0x10, 0x0b, 0x00, 0x4d, 0x69, 0x05, 0x01, 0x10, 0x16, 0x13, + 0x0e, 0x20, 0x00, 0x01, 0x70, 0x08, 0x01, 0x00, 0x13, 0x0e, 0x08, 0x08, 0x0e, 0x13, 0x00, 0x04, + 0x19, 0x1a, 0x10, 0x16, 0x0e, 0x13, 0x08, 0x00, 0x16, 0x00, 0x08, 0x13, 0x0e, 0x10, 0x06, 0x05, + 0x0b, 0x00, 0x05, 0x9e, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x2f, 0x2f, 0x2f, 0x18, + 0x2f, 0x2f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x71, 0x11, 0x12, 0x39, + 0x39, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x01, 0x5d, 0x5d, 0x5d, + 0x13, 0x3e, 0x03, 0x37, 0x16, 0x16, 0x17, 0x06, 0x06, 0x07, 0x26, 0x26, 0x37, 0x26, 0x27, 0x06, + 0x06, 0x07, 0x16, 0x16, 0x17, 0x36, 0x36, 0x19, 0x1f, 0x3b, 0x37, 0x36, 0x1a, 0x34, 0x6d, 0x3e, + 0x3e, 0x6d, 0x34, 0x35, 0x6e, 0xfc, 0x2b, 0x2e, 0x16, 0x2f, 0x16, 0x16, 0x2e, 0x17, 0x19, 0x2b, + 0x01, 0x36, 0x31, 0x56, 0x50, 0x4a, 0x24, 0x49, 0x9b, 0x61, 0x62, 0x9a, 0x49, 0x48, 0x9b, 0x62, + 0x53, 0x3f, 0x1f, 0x49, 0x2a, 0x2a, 0x46, 0x23, 0x23, 0x46, 0x00, 0x00, 0x00, 0x03, 0x00, 0x12, + 0x00, 0x00, 0x01, 0xe0, 0x02, 0xb5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x5a, 0x40, 0x38, + 0x0a, 0x40, 0x0b, 0x00, 0x4d, 0x0a, 0x54, 0xcf, 0x04, 0x01, 0x04, 0x2d, 0x20, 0x03, 0x01, 0x03, + 0x51, 0x02, 0x1a, 0x1c, 0x20, 0x19, 0x30, 0x19, 0x40, 0x19, 0x03, 0x19, 0x51, 0x1f, 0x22, 0x21, + 0x2c, 0x13, 0x57, 0x28, 0x01, 0x20, 0x55, 0x23, 0x0a, 0x22, 0x1d, 0x02, 0x1c, 0x55, 0x1a, 0x0a, + 0x07, 0x58, 0x0d, 0x01, 0x02, 0x0a, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, + 0x2f, 0x3f, 0xec, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0x32, 0xfd, 0x5d, 0x32, 0xd5, 0xd6, 0xfd, + 0x5d, 0xc6, 0xd4, 0x5d, 0xed, 0x2b, 0x31, 0x30, 0x21, 0x23, 0x11, 0x33, 0x37, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x26, 0x22, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x01, 0xcb, 0x72, 0x72, 0x15, 0x2b, 0x20, 0x20, 0x2a, 0x2a, 0x20, 0x20, 0x2b, 0xc2, + 0x0a, 0x0f, 0x06, 0x16, 0x1b, 0x0f, 0x05, 0x56, 0x56, 0x73, 0x35, 0x35, 0x11, 0x28, 0x41, 0x30, + 0x15, 0x1a, 0x11, 0x01, 0xd6, 0x87, 0x25, 0x29, 0x29, 0x25, 0x26, 0x29, 0x29, 0x41, 0x02, 0x0d, + 0x17, 0x20, 0x13, 0x17, 0x66, 0xfe, 0x90, 0x01, 0x70, 0x66, 0x19, 0x2d, 0x4a, 0x33, 0x1c, 0x03, + 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe0, 0x02, 0xb5, 0x02, 0x06, + 0x01, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf7, 0x01, 0xf4, 0x02, 0xb5, 0x00, 0x0b, + 0x00, 0x27, 0x00, 0x7c, 0x40, 0x37, 0x0b, 0x40, 0x09, 0x00, 0x4d, 0x00, 0x40, 0x09, 0x00, 0x4d, + 0x00, 0x0b, 0x01, 0x0b, 0x29, 0x20, 0x07, 0x30, 0x07, 0x50, 0x07, 0x03, 0x07, 0x51, 0x06, 0x40, + 0x0d, 0x00, 0x4d, 0x5f, 0x06, 0x01, 0x40, 0x06, 0x01, 0x06, 0x0f, 0x27, 0x01, 0x27, 0x1e, 0x18, + 0x16, 0x20, 0x15, 0x30, 0x15, 0x40, 0x15, 0x03, 0x15, 0x51, 0x1b, 0x1e, 0x1d, 0xb8, 0xff, 0xc0, + 0x40, 0x19, 0x1c, 0x22, 0x48, 0x1d, 0x28, 0x0f, 0x57, 0x24, 0x01, 0x1b, 0x55, 0x1d, 0x0a, 0x19, + 0x02, 0x18, 0x55, 0x16, 0x0a, 0x07, 0x00, 0x0b, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xd5, 0x32, 0xfd, 0x5d, 0xc5, 0x33, + 0x10, 0xd5, 0x5d, 0xd6, 0x5d, 0x5d, 0x2b, 0xed, 0x5d, 0x10, 0xc0, 0x5d, 0x31, 0x30, 0x2b, 0x2b, + 0x05, 0x2e, 0x03, 0x35, 0x11, 0x37, 0x11, 0x14, 0x16, 0x17, 0x03, 0x26, 0x22, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x17, 0x01, 0xe1, 0x30, 0x39, 0x1f, 0x0a, 0x72, 0x11, 0x22, 0xd6, 0x0a, 0x0f, + 0x06, 0x16, 0x1b, 0x0f, 0x05, 0x56, 0x56, 0x73, 0x35, 0x35, 0x11, 0x28, 0x41, 0x30, 0x15, 0x1a, + 0x11, 0x09, 0x03, 0x1b, 0x2a, 0x39, 0x22, 0x02, 0x06, 0x15, 0xfe, 0x00, 0x23, 0x29, 0x04, 0x01, + 0xdd, 0x02, 0x0d, 0x17, 0x20, 0x13, 0x17, 0x66, 0xfe, 0x90, 0x01, 0x70, 0x66, 0x19, 0x2d, 0x4a, + 0x33, 0x1c, 0x03, 0x03, 0xff, 0xff, 0x00, 0x12, 0xff, 0xf7, 0x01, 0xf4, 0x02, 0xb5, 0x02, 0x06, + 0x01, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0x66, 0x01, 0x72, 0x01, 0x8f, 0x02, 0xe4, 0x02, 0x06, + 0x01, 0x6f, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x81, 0x01, 0x79, 0x01, 0xa6, 0x02, 0xdd, 0x02, 0x06, + 0x00, 0x94, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x71, 0x01, 0x79, 0x01, 0x82, 0x02, 0xe4, 0x02, 0x06, + 0x00, 0x8d, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x71, 0x01, 0x72, 0x01, 0x80, 0x02, 0xe4, 0x02, 0x06, + 0x00, 0x8e, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x59, 0x01, 0x78, 0x01, 0x7d, 0x02, 0xdd, 0x02, 0x06, + 0x01, 0x70, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x71, 0x01, 0x72, 0x01, 0x7c, 0x02, 0xdd, 0x02, 0x06, + 0x01, 0x71, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x62, 0x01, 0x72, 0x01, 0x73, 0x02, 0xde, 0x02, 0x06, + 0x01, 0x72, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x6b, 0x01, 0x79, 0x01, 0x7d, 0x02, 0xdd, 0x02, 0x06, + 0x01, 0x73, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x6a, 0x01, 0x72, 0x01, 0x8a, 0x02, 0xe4, 0x02, 0x06, + 0x01, 0x74, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x81, 0x01, 0x78, 0x01, 0x92, 0x02, 0xe4, 0x02, 0x06, + 0x01, 0x75, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x66, 0xff, 0x90, 0x01, 0x8f, 0x01, 0x02, 0x02, 0x07, + 0x01, 0x6f, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0xff, 0x97, 0x01, 0xa6, + 0x00, 0xfb, 0x02, 0x07, 0x00, 0x94, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, + 0xff, 0x97, 0x01, 0x82, 0x01, 0x02, 0x02, 0x07, 0x00, 0x8d, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x71, 0xff, 0x90, 0x01, 0x80, 0x01, 0x02, 0x02, 0x07, 0x00, 0x8e, 0x00, 0x00, + 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0xff, 0x96, 0x01, 0x7d, 0x00, 0xfb, 0x02, 0x07, + 0x01, 0x70, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0x90, 0x01, 0x7c, + 0x00, 0xfb, 0x02, 0x07, 0x01, 0x71, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x62, + 0xff, 0x90, 0x01, 0x73, 0x00, 0xfc, 0x02, 0x07, 0x01, 0x72, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x6b, 0xff, 0x97, 0x01, 0x7d, 0x00, 0xfb, 0x02, 0x07, 0x01, 0x73, 0x00, 0x00, + 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0x90, 0x01, 0x8a, 0x01, 0x02, 0x02, 0x07, + 0x01, 0x74, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0xff, 0x96, 0x01, 0x92, + 0x01, 0x02, 0x02, 0x07, 0x01, 0x75, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc4, + 0x01, 0xdb, 0x01, 0x31, 0x02, 0xb5, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x03, 0x04, 0x01, 0x03, + 0x9f, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x23, 0x35, 0x01, 0x31, + 0x1e, 0x4f, 0x02, 0xb5, 0xda, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, 0xff, 0x56, 0x01, 0x50, + 0xff, 0xd3, 0x00, 0x0f, 0x00, 0x12, 0xb6, 0x03, 0x00, 0x0a, 0x10, 0x01, 0x06, 0x92, 0x00, 0x3f, + 0xc5, 0x01, 0x10, 0xd6, 0xde, 0xcd, 0x31, 0x30, 0x17, 0x33, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x27, 0x35, 0x32, 0x3e, 0x02, 0x35, 0xee, 0x5f, 0x03, 0x3d, 0x38, 0x0e, 0x23, 0x06, 0x11, + 0x1b, 0x14, 0x0a, 0x2d, 0x11, 0x0e, 0x30, 0x2e, 0x05, 0x02, 0x3b, 0x02, 0x0b, 0x15, 0x12, 0x00, + 0x00, 0x01, 0x00, 0xa1, 0x02, 0x17, 0x01, 0x4d, 0x02, 0xc4, 0x00, 0x08, 0x00, 0x12, 0xb6, 0x05, + 0x00, 0x01, 0x09, 0x00, 0x04, 0x8a, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd5, 0xce, 0x31, 0x30, + 0x01, 0x23, 0x26, 0x36, 0x37, 0x17, 0x06, 0x06, 0x15, 0x01, 0x16, 0x6d, 0x08, 0x42, 0x3e, 0x2c, + 0x1c, 0x1b, 0x02, 0x17, 0x4a, 0x53, 0x10, 0x3d, 0x11, 0x2b, 0x28, 0x00, 0x00, 0x01, 0x00, 0xc4, + 0x02, 0x0a, 0x01, 0x2f, 0x02, 0xb5, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x03, 0x04, 0x01, 0x03, + 0x9f, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x23, 0x35, 0x01, 0x2f, + 0x1e, 0x4d, 0x02, 0xb5, 0xab, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5e, 0xff, 0x81, 0x01, 0xa1, + 0x02, 0xf1, 0x02, 0x06, 0x00, 0x0b, 0x00, 0x2b, 0xff, 0xff, 0x00, 0x55, 0xff, 0x81, 0x01, 0x98, + 0x02, 0xf1, 0x02, 0x06, 0x00, 0x0c, 0x00, 0x2b, 0xff, 0xff, 0x00, 0x71, 0x00, 0xf8, 0x01, 0x83, + 0x01, 0x71, 0x02, 0x06, 0x00, 0x10, 0x00, 0x34, 0xff, 0xff, 0x00, 0x2f, 0xff, 0x85, 0x01, 0xc5, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x12, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x12, 0xff, 0xb5, 0x01, 0xd4, + 0x02, 0xb5, 0x02, 0x06, 0x00, 0x23, 0x00, 0x3c, 0xff, 0xff, 0x00, 0x71, 0xff, 0x85, 0x01, 0x86, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x3e, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x31, 0xff, 0x85, 0x01, 0xc7, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x3f, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x6d, 0xff, 0x85, 0x01, 0x83, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x40, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x85, 0x01, 0xb5, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x5e, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x85, 0x01, 0xb5, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x60, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x84, 0x00, 0x5e, 0x01, 0x7c, + 0x02, 0x0b, 0x02, 0x06, 0x00, 0x6c, 0x00, 0x37, 0xff, 0xff, 0x00, 0x72, 0x00, 0xa7, 0x01, 0x82, + 0x01, 0xc5, 0x02, 0x06, 0x00, 0x72, 0x00, 0xfc, 0xff, 0xff, 0x00, 0x36, 0x01, 0x07, 0x01, 0xbf, + 0x01, 0x63, 0x02, 0x06, 0x00, 0x73, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x00, 0x01, 0x07, 0x01, 0xf4, + 0x01, 0x63, 0x02, 0x06, 0x00, 0x74, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x9b, 0x00, 0x5e, 0x01, 0x93, + 0x02, 0x0b, 0x02, 0x06, 0x00, 0x78, 0x00, 0x37, 0xff, 0xff, 0x00, 0xa9, 0xff, 0xfa, 0x01, 0x4f, + 0x02, 0x70, 0x02, 0x07, 0x00, 0x7c, 0x00, 0x02, 0x00, 0x9f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x32, + 0x00, 0x64, 0x01, 0xc3, 0x02, 0x04, 0x02, 0x06, 0x00, 0x86, 0x00, 0x36, 0xff, 0xff, 0x00, 0x32, + 0x00, 0x64, 0x01, 0xc3, 0x02, 0x04, 0x02, 0x06, 0x00, 0x96, 0x00, 0x36, 0xff, 0xff, 0x00, 0x45, + 0xff, 0xf8, 0x01, 0xb2, 0x02, 0x74, 0x02, 0x07, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf5, 0x01, 0xd6, 0x02, 0xb6, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x69, + 0x40, 0x42, 0x22, 0x40, 0x0c, 0x00, 0x4d, 0x21, 0x40, 0x0c, 0x00, 0x4d, 0x0f, 0x40, 0x0c, 0x00, + 0x4d, 0x0e, 0x40, 0x0c, 0x00, 0x4d, 0x00, 0x53, 0x18, 0x29, 0x06, 0x0f, 0x0f, 0x0e, 0x27, 0x51, + 0x21, 0x24, 0x25, 0x20, 0x22, 0x28, 0x26, 0x01, 0x25, 0x00, 0x23, 0x04, 0x0a, 0x57, 0x1d, 0x09, + 0x06, 0x55, 0x10, 0x03, 0x57, 0x10, 0x13, 0x30, 0x13, 0x02, 0x13, 0x0b, 0x21, 0x30, 0x0f, 0x01, + 0x0f, 0x73, 0x0d, 0x04, 0x00, 0x3f, 0xed, 0x5d, 0x32, 0x3f, 0x5d, 0xed, 0xd5, 0xed, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc6, 0xc4, 0xd5, 0x32, 0xfd, 0xc5, 0x33, 0x11, 0x33, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x03, 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x01, + 0x59, 0x27, 0x29, 0x14, 0x24, 0x0d, 0x0e, 0x1c, 0x0a, 0x2d, 0x34, 0x07, 0x8e, 0x1a, 0x2d, 0x17, + 0x2c, 0x44, 0x2d, 0x17, 0x1d, 0x38, 0x52, 0x34, 0x2f, 0x61, 0x22, 0x37, 0x37, 0x7b, 0xee, 0x42, + 0x46, 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x01, 0xc7, 0x53, 0x49, 0x0c, 0x09, 0x23, 0x41, 0x5a, + 0x37, 0x38, 0x5b, 0x40, 0x23, 0x0e, 0x0b, 0x02, 0x06, 0x53, 0x3a, 0x15, 0x4f, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0xff, 0xf8, 0x01, 0xe7, 0x02, 0x72, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x39, + 0x00, 0x47, 0x40, 0x25, 0x32, 0x4a, 0x17, 0x2b, 0x4a, 0x1d, 0x3b, 0x39, 0x23, 0x52, 0x03, 0x0a, + 0x0b, 0x3a, 0x04, 0x38, 0x57, 0x12, 0x23, 0x22, 0x39, 0x0b, 0x0a, 0x1a, 0x0a, 0x0b, 0x39, 0x1a, + 0x22, 0x05, 0x00, 0x12, 0x03, 0x26, 0x57, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x17, 0x39, + 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x39, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xc5, 0xd6, + 0xed, 0x32, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x11, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x03, 0x15, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x26, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x01, + 0x1d, 0x23, 0x3d, 0x25, 0x05, 0x1d, 0x19, 0x0a, 0x5a, 0x0d, 0x24, 0x41, 0x5c, 0x39, 0x3c, 0x50, + 0x30, 0x14, 0x25, 0x26, 0x36, 0x32, 0x13, 0x2e, 0x4e, 0x57, 0x09, 0x19, 0x0a, 0x0f, 0x1c, 0x17, + 0x0e, 0x28, 0x21, 0x12, 0x1f, 0x20, 0x21, 0x16, 0x08, 0x19, 0x08, 0x08, 0x06, 0x08, 0x02, 0x0a, + 0x1e, 0x14, 0x1e, 0x17, 0x0c, 0x28, 0x22, 0x2b, 0x36, 0x1f, 0x0b, 0x17, 0x29, 0x3a, 0x24, 0x2b, + 0x47, 0x17, 0x10, 0x55, 0x37, 0x20, 0x42, 0x34, 0x21, 0x01, 0x17, 0xa8, 0x02, 0x02, 0x07, 0x13, + 0x23, 0x1b, 0x2d, 0x27, 0x66, 0x29, 0x24, 0x2c, 0x22, 0x01, 0x01, 0x99, 0x00, 0x02, 0x00, 0x36, + 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x6b, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x5e, 0xb9, 0x00, 0x10, 0xff, + 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xc0, 0xb5, 0x10, 0x00, 0x4d, 0x14, 0x53, 0x07, + 0xb8, 0xff, 0xc0, 0xb6, 0x09, 0x0f, 0x48, 0x07, 0x1d, 0x10, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x0a, + 0x0a, 0x0f, 0x48, 0x0e, 0x1c, 0x19, 0x51, 0x01, 0x51, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x0a, + 0x0f, 0x48, 0x0d, 0x17, 0x57, 0x02, 0x02, 0x0a, 0x10, 0x55, 0x0f, 0x02, 0x11, 0x57, 0x0a, 0x07, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x2f, 0x2b, 0xed, 0xed, 0x10, 0xd6, + 0x2b, 0xc5, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x15, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x15, 0x03, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x23, 0x15, 0x16, 0x16, 0xb1, 0x2e, 0x38, 0x5b, 0x40, 0x23, 0x7d, 0x76, 0x23, 0x5c, 0x2d, + 0x01, 0x5f, 0xac, 0x36, 0x3d, 0x40, 0x41, 0x2a, 0x08, 0x22, 0x02, 0x05, 0x76, 0x15, 0x30, 0x4d, + 0x38, 0x67, 0x66, 0x08, 0x0a, 0x02, 0x61, 0x66, 0xfe, 0x5e, 0x2e, 0x33, 0x36, 0x2a, 0xbd, 0x01, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0xff, 0xf5, 0x01, 0xd7, 0x02, 0xaf, 0x00, 0x14, + 0x00, 0x21, 0x00, 0x5d, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb3, 0x18, 0x00, 0x4d, 0x12, 0xb8, 0xff, + 0xc0, 0x40, 0x0b, 0x18, 0x00, 0x4d, 0x00, 0x40, 0x18, 0x00, 0x4d, 0x15, 0x53, 0x08, 0xb8, 0xff, + 0xc0, 0x40, 0x0a, 0x09, 0x10, 0x48, 0x08, 0x23, 0x1b, 0x00, 0x51, 0x13, 0x11, 0xb8, 0xff, 0xc0, + 0x40, 0x13, 0x09, 0x10, 0x48, 0x11, 0x22, 0x18, 0x57, 0x00, 0x03, 0x03, 0x0d, 0x13, 0x55, 0x12, + 0x9f, 0x1f, 0x57, 0x0d, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xc5, 0xed, 0x01, + 0x10, 0xd6, 0x2b, 0xc5, 0xfd, 0xc0, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, + 0x2b, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x11, 0x21, 0x15, 0x23, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, + 0x36, 0xba, 0x1a, 0x30, 0x18, 0x2e, 0x46, 0x2f, 0x18, 0x1e, 0x3a, 0x54, 0x36, 0x30, 0x64, 0x22, + 0x01, 0x64, 0xe9, 0xa0, 0x2b, 0x2c, 0x14, 0x27, 0x0e, 0x0e, 0x1f, 0x0b, 0x30, 0x38, 0x01, 0xcb, + 0x0c, 0x09, 0x23, 0x41, 0x5a, 0x37, 0x38, 0x5b, 0x40, 0x23, 0x0e, 0x0b, 0x02, 0xa1, 0x66, 0xfe, + 0xa5, 0x42, 0x46, 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf2, + 0xff, 0xf5, 0x01, 0xd6, 0x02, 0xb5, 0x00, 0x0c, 0x00, 0x22, 0x00, 0x41, 0x40, 0x27, 0x11, 0x20, + 0x18, 0x00, 0x4d, 0x0e, 0x40, 0x09, 0x0c, 0x00, 0x4c, 0x00, 0x53, 0x19, 0x40, 0x09, 0x0e, 0x48, + 0x19, 0x24, 0x10, 0x11, 0x06, 0x51, 0x0d, 0x21, 0x23, 0x0a, 0x57, 0x1e, 0x07, 0x11, 0x03, 0x57, + 0x14, 0x0b, 0x0d, 0x10, 0x9f, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xd6, + 0xce, 0xfd, 0xd0, 0xc0, 0x10, 0xde, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x25, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0x36, 0x36, 0x37, 0x15, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x01, 0x59, + 0x2b, 0x2c, 0x14, 0x27, 0x0e, 0x0e, 0x1f, 0x0b, 0x30, 0x38, 0xfe, 0x99, 0x2d, 0x5f, 0x3b, 0x1a, + 0x30, 0x18, 0x2e, 0x46, 0x2f, 0x18, 0x1e, 0x3a, 0x54, 0x36, 0x30, 0x64, 0x22, 0xee, 0x42, 0x46, + 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x01, 0xc2, 0x19, 0x2a, 0x10, 0xea, 0x0c, 0x09, 0x23, 0x41, + 0x5a, 0x37, 0x38, 0x5b, 0x40, 0x23, 0x0e, 0x0b, 0x02, 0x04, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, + 0xff, 0xfa, 0x01, 0xd4, 0x02, 0x74, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x43, 0x40, 0x28, 0x01, 0x40, + 0x0b, 0x00, 0x4d, 0x01, 0x20, 0x0a, 0x00, 0x4d, 0x01, 0x30, 0x09, 0x00, 0x4d, 0x15, 0x53, 0x60, + 0x0a, 0x01, 0x0a, 0x1e, 0x04, 0x19, 0x51, 0x00, 0x10, 0x1d, 0x05, 0x57, 0x18, 0x18, 0x03, 0x12, + 0x57, 0x0d, 0x07, 0x00, 0x03, 0x8b, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, + 0x10, 0xd6, 0xce, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x03, + 0x36, 0x36, 0x37, 0x15, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x16, 0x16, 0x04, 0x2d, 0x5f, 0x3b, 0x22, + 0x37, 0x59, 0x3e, 0x21, 0x7e, 0x76, 0x22, 0x4b, 0x2c, 0xb2, 0x26, 0x3a, 0x3a, 0x34, 0x28, 0x07, + 0x22, 0x02, 0x21, 0x19, 0x2a, 0x10, 0xee, 0x13, 0x2c, 0x4b, 0x37, 0x67, 0x64, 0x06, 0x0b, 0x01, + 0xc6, 0xfe, 0x92, 0x2e, 0x33, 0x33, 0x26, 0xb6, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd5, 0x02, 0x79, 0x00, 0x1f, 0x00, 0x30, 0xb5, 0x0a, 0x46, 0x60, 0x1d, 0x01, + 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x09, 0x0d, 0x48, 0x1d, 0x21, 0x13, 0x03, 0x20, 0x12, 0x0f, + 0x4a, 0x18, 0x03, 0x04, 0x07, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0xc7, 0x3a, 0x58, 0x1a, 0x1f, 0x12, 0x40, 0x30, 0x52, 0x4a, + 0x1b, 0x2c, 0x38, 0x1c, 0x29, 0x41, 0x17, 0x20, 0x07, 0x1e, 0x2b, 0x38, 0x20, 0x40, 0x65, 0x46, + 0x26, 0x8b, 0x0d, 0x1b, 0x10, 0x61, 0x0b, 0x16, 0x71, 0x6a, 0x3d, 0x52, 0x31, 0x15, 0x15, 0x0f, + 0x62, 0x04, 0x10, 0x0e, 0x0b, 0x28, 0x51, 0x79, 0x51, 0x9b, 0xa8, 0x00, 0x00, 0x01, 0x00, 0x1b, + 0xff, 0xf3, 0x02, 0x10, 0x02, 0xbe, 0x00, 0x2a, 0x00, 0x4d, 0xb9, 0x00, 0x0e, 0xff, 0xc0, 0xb4, + 0x14, 0x17, 0x48, 0x0e, 0x23, 0xb8, 0xff, 0xc0, 0xb7, 0x13, 0x17, 0x48, 0x23, 0x2c, 0x05, 0x46, + 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x13, 0x17, 0x48, 0x16, 0x2b, 0x24, 0x27, 0x4a, 0x0f, 0x20, + 0x01, 0x20, 0xab, 0x00, 0x02, 0x4a, 0x1b, 0x03, 0x0d, 0x4a, 0x0e, 0x0a, 0x4a, 0x11, 0x09, 0x00, + 0x3f, 0xed, 0xd5, 0xed, 0x3f, 0xfd, 0xc6, 0x3f, 0x5d, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xed, + 0x10, 0xd6, 0x2b, 0xc6, 0x2b, 0x31, 0x30, 0x01, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, + 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, + 0x87, 0x38, 0x2f, 0x3f, 0x49, 0x13, 0x24, 0x32, 0x20, 0x23, 0x32, 0x1c, 0x1f, 0x2a, 0x49, 0x2c, + 0x39, 0x5b, 0x40, 0x23, 0x28, 0x45, 0x5c, 0x33, 0x21, 0x24, 0x11, 0x3c, 0x26, 0x0f, 0x21, 0x11, + 0x1b, 0x08, 0x0a, 0x0e, 0x10, 0x20, 0x0b, 0x01, 0xf1, 0x1d, 0x6c, 0x69, 0x3e, 0x54, 0x33, 0x16, + 0x12, 0x0f, 0x61, 0x16, 0x15, 0x2a, 0x53, 0x78, 0x4e, 0x52, 0x7a, 0x50, 0x27, 0x0b, 0x2c, 0x24, + 0x05, 0x05, 0x5e, 0x02, 0x03, 0x10, 0x20, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf3, 0x02, 0x09, + 0x02, 0x2b, 0x00, 0x2c, 0x00, 0x29, 0x40, 0x15, 0x25, 0x0e, 0x2e, 0x1e, 0x53, 0x00, 0x2d, 0x25, + 0x21, 0x57, 0x28, 0x07, 0x12, 0x57, 0x0b, 0xac, 0x16, 0x19, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xfd, + 0xc6, 0x3f, 0xed, 0x3f, 0xed, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x37, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x28, 0x21, 0x3e, 0x5a, 0x39, 0x0d, 0x1e, + 0x0d, 0x0e, 0x31, 0x29, 0x19, 0x29, 0x0d, 0x1c, 0x0a, 0x12, 0x0d, 0x14, 0x19, 0x08, 0x0d, 0x13, + 0x2e, 0x1c, 0x1e, 0x2f, 0x22, 0x12, 0x42, 0x44, 0x18, 0x39, 0x17, 0x12, 0x18, 0x45, 0x2a, 0x41, + 0x5c, 0x3c, 0x1c, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x02, 0x02, 0x2d, 0x20, 0x0a, 0x07, 0x5a, 0x05, + 0x04, 0x17, 0x1b, 0x31, 0x08, 0x09, 0x16, 0x25, 0x33, 0x1e, 0x40, 0x4b, 0x09, 0x0a, 0x67, 0x0b, + 0x0e, 0x26, 0x43, 0x5b, 0xff, 0xff, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd9, 0x02, 0x72, 0x02, 0x06, + 0x00, 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xf9, 0x01, 0xe2, 0x02, 0x72, 0x00, 0x19, + 0x00, 0x2a, 0x00, 0x52, 0xb9, 0x00, 0x12, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x12, 0xb8, 0xff, + 0x80, 0xb3, 0x0f, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x0f, 0x00, 0x4d, 0x12, 0x40, + 0x10, 0x00, 0x4d, 0x22, 0x46, 0x03, 0x2c, 0x20, 0x1a, 0x30, 0x1a, 0x02, 0x1a, 0x44, 0x0b, 0x10, + 0x84, 0x15, 0x2b, 0x1d, 0x48, 0x08, 0x09, 0x0c, 0x27, 0x48, 0x13, 0x00, 0x02, 0x00, 0x3f, 0xc4, + 0xed, 0x32, 0x3f, 0xed, 0x01, 0x10, 0xd0, 0xed, 0xd4, 0xed, 0x5d, 0x10, 0xd6, 0xed, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x13, 0x16, + 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0xfa, 0x76, 0x72, + 0x22, 0x3d, 0x54, 0x33, 0x17, 0x33, 0x1a, 0x05, 0x1d, 0x19, 0x0a, 0x5a, 0x0d, 0x27, 0x43, 0x5b, + 0x3c, 0x05, 0x0c, 0x06, 0x20, 0x26, 0x13, 0x06, 0x04, 0x12, 0x24, 0x20, 0x05, 0x12, 0x05, 0x02, + 0x72, 0x95, 0xa7, 0x58, 0x79, 0x4b, 0x21, 0x06, 0x08, 0x02, 0x09, 0x1e, 0x14, 0x1e, 0x17, 0x0c, + 0x28, 0x22, 0x2b, 0x36, 0x1f, 0x0b, 0xfd, 0xf2, 0x01, 0x21, 0x3a, 0x4f, 0x2d, 0x25, 0x4c, 0x3e, + 0x27, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xfa, 0x01, 0xbe, 0x02, 0x6b, 0x00, 0x10, + 0x00, 0x1d, 0x00, 0x40, 0x40, 0x28, 0x01, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x00, 0x40, 0x09, 0x0a, + 0x00, 0x4c, 0x16, 0x51, 0x0f, 0x51, 0x03, 0x1f, 0x00, 0x1f, 0x01, 0x1b, 0x53, 0x00, 0x09, 0x1e, + 0x11, 0x57, 0x06, 0x09, 0x18, 0x57, 0x4f, 0x0e, 0x01, 0x0e, 0x00, 0x48, 0x01, 0x02, 0x00, 0x3f, + 0xfd, 0xd6, 0x5d, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x5d, 0x10, 0xd6, 0xed, 0xed, + 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x35, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x33, 0x35, 0x03, 0x32, 0x3e, 0x02, 0x33, 0x35, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x50, 0x01, 0x6e, 0x2d, 0x50, 0x23, 0x7c, 0x83, 0x23, 0x41, 0x5c, 0x3a, 0x29, 0x3d, 0x07, 0x12, + 0x12, 0x0e, 0x04, 0x2f, 0x38, 0x41, 0x40, 0x02, 0x05, 0x66, 0xfd, 0xa0, 0x0b, 0x06, 0x64, 0x67, + 0x37, 0x4b, 0x2c, 0x13, 0x7f, 0xfe, 0x5e, 0x01, 0x01, 0x02, 0xb6, 0x27, 0x32, 0x32, 0x2f, 0x00, + 0x00, 0x02, 0x00, 0x1c, 0xff, 0xf5, 0x01, 0xae, 0x02, 0xaf, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x36, + 0x40, 0x20, 0x0e, 0x40, 0x0a, 0x00, 0x4d, 0x0d, 0x40, 0x0a, 0x00, 0x4d, 0x1c, 0x07, 0x51, 0x10, + 0x1f, 0x0d, 0x00, 0x53, 0x16, 0x1e, 0x0a, 0x57, 0x19, 0x0b, 0x03, 0x57, 0x13, 0x09, 0x1d, 0x48, + 0x0f, 0x00, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, + 0xfd, 0xc0, 0x31, 0x30, 0x2b, 0x2b, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x03, 0x35, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x35, 0x99, 0x2f, 0x34, 0x0f, 0x1a, 0x0e, 0x0e, 0x24, 0x14, 0x2c, 0x28, 0x4e, + 0x01, 0x63, 0x22, 0x62, 0x2f, 0x6e, 0x71, 0x5f, 0x5d, 0x19, 0x30, 0x12, 0xee, 0x3f, 0x50, 0x02, + 0x02, 0x01, 0x00, 0x08, 0x0b, 0x46, 0x01, 0x19, 0x66, 0xfd, 0x5f, 0x0b, 0x0e, 0x82, 0x71, 0x73, + 0x85, 0x0b, 0x0a, 0x7e, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x58, 0x01, 0xd7, 0x01, 0xe2, 0x00, 0x2a, + 0x00, 0x3a, 0x00, 0x5b, 0x40, 0x3c, 0x05, 0x40, 0x18, 0x19, 0x00, 0x4c, 0x04, 0x40, 0x18, 0x00, + 0x4d, 0x04, 0x20, 0x14, 0x00, 0x4d, 0x03, 0x20, 0x12, 0x13, 0x00, 0x4c, 0x19, 0x53, 0x08, 0x35, + 0x53, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x04, 0x00, 0x3c, 0x2b, 0x53, 0x10, 0x21, + 0x3b, 0x30, 0x05, 0x1e, 0x1e, 0x05, 0x30, 0x03, 0x0d, 0x38, 0x57, 0x26, 0x07, 0x11, 0x14, 0x57, + 0x0d, 0x0f, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x10, + 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x14, 0x0e, 0x02, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x05, 0x14, 0x1e, 0x02, 0x17, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x01, 0xd7, 0x0a, 0x1d, 0x32, 0x27, 0x1c, 0x25, 0x17, 0x2d, 0x43, 0x2b, 0x29, 0x4c, 0x22, + 0x19, 0x1a, 0x3a, 0x20, 0x09, 0x17, 0x13, 0x0e, 0x0f, 0x1f, 0x2f, 0x20, 0x3d, 0x44, 0x1f, 0x39, + 0x50, 0x32, 0x31, 0x52, 0x3a, 0x21, 0xfe, 0xc6, 0x11, 0x1d, 0x26, 0x15, 0x19, 0x21, 0x12, 0x07, + 0x35, 0x2a, 0x2a, 0x33, 0x01, 0x1c, 0x15, 0x37, 0x38, 0x37, 0x15, 0x15, 0x31, 0x23, 0x1d, 0x33, + 0x25, 0x16, 0x0a, 0x0f, 0x61, 0x0b, 0x0d, 0x02, 0x07, 0x0f, 0x0d, 0x0c, 0x12, 0x13, 0x1a, 0x14, + 0x25, 0x69, 0x48, 0x30, 0x4c, 0x36, 0x1c, 0x1b, 0x33, 0x49, 0x39, 0x1a, 0x2a, 0x23, 0x1d, 0x0d, + 0x0d, 0x24, 0x27, 0x28, 0x11, 0x34, 0x33, 0x32, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x52, 0x40, 0x0e, 0x05, 0x40, 0x09, 0x00, 0x4d, 0x04, 0x40, 0x09, + 0x00, 0x4d, 0x06, 0x03, 0x44, 0x0b, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x0c, 0x48, 0x0b, 0x0d, 0x08, + 0x05, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x09, 0x0c, 0x48, 0x01, 0x0c, 0x40, 0x06, 0x01, 0x06, + 0x48, 0x03, 0x03, 0x0a, 0x02, 0x48, 0x0b, 0x08, 0x07, 0x48, 0x0a, 0x02, 0x00, 0x08, 0x00, 0x3f, + 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x2b, 0xc6, 0xc6, 0x10, + 0xd6, 0x2b, 0xed, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x33, 0x35, 0x21, 0x35, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x21, 0x11, 0x3f, 0x01, 0x12, 0xdc, 0xdc, 0xfc, 0x01, 0x77, 0x66, 0xae, 0x66, 0x8b, + 0x66, 0xfd, 0x95, 0x00, 0x00, 0x02, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xd5, 0x02, 0x79, 0x00, 0x1e, + 0x00, 0x27, 0x00, 0x54, 0xb5, 0x27, 0x40, 0x0d, 0x00, 0x4d, 0x24, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, + 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x0d, 0x00, 0x4d, 0x1f, 0x40, 0x0d, 0x00, 0x4d, + 0x27, 0x00, 0x53, 0x40, 0x13, 0x60, 0x13, 0x02, 0x13, 0x29, 0x1f, 0x53, 0x09, 0x1b, 0x28, 0x27, + 0x48, 0x00, 0x00, 0x0e, 0x22, 0x57, 0x16, 0x09, 0x08, 0x05, 0x57, 0x0e, 0x03, 0x00, 0x3f, 0xfd, + 0xc6, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xed, + 0x32, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, + 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x17, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x01, 0x63, 0x1c, 0x2e, 0x3d, 0x21, + 0x1f, 0x3c, 0x17, 0x1e, 0x12, 0x29, 0x2a, 0x27, 0x0f, 0x45, 0x66, 0x43, 0x21, 0x7a, 0x6a, 0x3a, + 0x52, 0x34, 0x18, 0x02, 0x02, 0x6d, 0x3b, 0x2d, 0x1b, 0x29, 0x1c, 0x0e, 0x01, 0x01, 0x59, 0x32, + 0x45, 0x2b, 0x13, 0x0c, 0x0b, 0x60, 0x09, 0x0c, 0x09, 0x04, 0x31, 0x56, 0x75, 0x44, 0x9e, 0xa8, + 0x31, 0x51, 0x68, 0x36, 0x11, 0x23, 0x12, 0x61, 0x51, 0x52, 0x1a, 0x2d, 0x3b, 0x21, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xe7, 0x02, 0x79, 0x00, 0x30, 0x00, 0x7f, 0xb6, 0x26, + 0x40, 0x0e, 0x0f, 0x00, 0x4c, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x01, 0xb8, 0xff, + 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0xb7, 0x0d, 0x00, 0x4d, 0x25, 0x40, 0x0f, + 0x01, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0f, 0x12, 0x48, 0x0f, 0x32, 0x30, 0x40, 0x09, 0x00, + 0x4d, 0x30, 0x1a, 0x2c, 0x63, 0x1d, 0x06, 0x63, 0x70, 0x17, 0x80, 0x17, 0x90, 0x17, 0x03, 0x17, + 0x31, 0x26, 0x29, 0x67, 0x22, 0x40, 0x30, 0x01, 0x30, 0x65, 0x00, 0x1a, 0x1a, 0x00, 0x12, 0x22, + 0x05, 0x0e, 0x0b, 0x67, 0x12, 0x0d, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, + 0x18, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0xd5, 0xc5, + 0x2b, 0x10, 0xd6, 0x2b, 0x5d, 0xc6, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, + 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x01, 0x7e, 0x53, 0x1f, 0x34, 0x26, + 0x15, 0x13, 0x21, 0x2c, 0x19, 0x2c, 0x5c, 0x21, 0x28, 0x2a, 0x74, 0x3c, 0x2e, 0x56, 0x42, 0x28, + 0x3c, 0x29, 0x26, 0x24, 0x23, 0x3a, 0x4b, 0x29, 0x36, 0x67, 0x29, 0x2a, 0x1a, 0x53, 0x27, 0x26, + 0x37, 0x34, 0x37, 0x5d, 0x01, 0x10, 0x09, 0x15, 0x22, 0x1a, 0x17, 0x20, 0x15, 0x09, 0x18, 0x13, + 0x66, 0x17, 0x1c, 0x14, 0x2d, 0x48, 0x35, 0x3a, 0x4a, 0x15, 0x18, 0x4b, 0x22, 0x2e, 0x41, 0x28, + 0x13, 0x1c, 0x17, 0x5f, 0x0e, 0x16, 0x1f, 0x27, 0x23, 0x28, 0x00, 0x00, 0x00, 0x01, 0xff, 0xcc, + 0xff, 0x59, 0x01, 0xba, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x2e, 0x40, 0x18, 0x14, 0x11, 0x19, 0x16, + 0x13, 0x44, 0x10, 0x0f, 0x01, 0x0f, 0x08, 0x18, 0x15, 0x48, 0x14, 0x11, 0x48, 0x0f, 0x02, 0x0c, + 0x4a, 0x08, 0x05, 0x0f, 0x00, 0x3f, 0xc5, 0xed, 0x3f, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xc4, 0xd6, + 0x5d, 0xfd, 0xc0, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x37, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x15, 0x23, 0x15, 0xba, + 0x10, 0x25, 0x3e, 0x2d, 0x0d, 0x2b, 0x16, 0x12, 0x0e, 0x10, 0x11, 0x32, 0x01, 0x7b, 0xff, 0x00, + 0xe0, 0xe0, 0x12, 0x2e, 0x45, 0x2f, 0x17, 0x04, 0x08, 0x63, 0x05, 0x02, 0x3f, 0x02, 0x6b, 0x66, + 0x96, 0x66, 0xc7, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x02, 0x10, 0x02, 0xbe, 0x00, 0x2c, + 0x00, 0x40, 0x40, 0x25, 0x1e, 0x44, 0x1f, 0xb0, 0x08, 0x01, 0x02, 0x90, 0x08, 0xa0, 0x08, 0x02, + 0x08, 0x2e, 0x17, 0x46, 0xb0, 0x28, 0x01, 0x28, 0x2d, 0x1f, 0x1f, 0x05, 0x1a, 0x4a, 0x23, 0x09, + 0x0c, 0x84, 0x05, 0xab, 0x10, 0x12, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0x5f, 0x5d, 0xd6, 0xed, + 0x31, 0x30, 0x01, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x07, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, + 0x33, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x01, 0x17, 0x21, 0x24, + 0x11, 0x3c, 0x26, 0x0f, 0x21, 0x11, 0x1b, 0x08, 0x0a, 0x0e, 0x10, 0x21, 0x0a, 0x13, 0x38, 0x2f, + 0x27, 0x34, 0x20, 0x0d, 0x46, 0x44, 0x0b, 0x1a, 0x0b, 0x7b, 0x16, 0x5d, 0x42, 0x3a, 0x5d, 0x42, + 0x24, 0x26, 0x44, 0x5c, 0x02, 0x79, 0x0b, 0x2c, 0x24, 0x05, 0x05, 0x5e, 0x02, 0x03, 0x10, 0x20, + 0x3a, 0x1d, 0x25, 0x3c, 0x4e, 0x29, 0x6f, 0x69, 0x02, 0x02, 0xe2, 0xfe, 0xcb, 0x08, 0x14, 0x29, + 0x51, 0x79, 0x50, 0x4f, 0x79, 0x52, 0x29, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x5b, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x15, 0x00, 0x25, 0x00, 0x75, 0xb9, 0x00, 0x23, 0xff, 0xc0, 0x40, 0x0f, 0x0c, + 0x00, 0x4d, 0x20, 0x23, 0x01, 0x19, 0x40, 0x0c, 0x00, 0x4d, 0x2f, 0x19, 0x01, 0x11, 0xb8, 0xff, + 0xc0, 0x40, 0x32, 0x0d, 0x0e, 0x00, 0x4c, 0x01, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x11, 0x01, 0x14, + 0x01, 0x14, 0x11, 0x03, 0x26, 0x27, 0x19, 0x64, 0x04, 0x15, 0x51, 0x00, 0x27, 0x23, 0x64, 0x0e, + 0x13, 0x51, 0x12, 0x26, 0x15, 0x14, 0x11, 0x01, 0x1e, 0x1e, 0x01, 0x11, 0x14, 0x04, 0x09, 0x13, + 0x02, 0x16, 0xa5, 0x09, 0x0e, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x01, 0x10, 0xd6, 0xed, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xd6, 0xed, 0x11, 0x12, 0x17, 0x39, + 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x31, 0x30, 0x2b, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x01, 0x03, 0x16, + 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x03, 0x33, 0x13, + 0x13, 0x03, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x01, 0xeb, + 0xb0, 0x2a, 0x31, 0x11, 0x26, 0x3a, 0x2a, 0x2a, 0x3a, 0x26, 0x11, 0x31, 0x2a, 0xb2, 0x7c, 0x76, + 0x76, 0x76, 0x1a, 0x14, 0x09, 0x0d, 0x11, 0x07, 0x06, 0x11, 0x0e, 0x0a, 0x15, 0x02, 0x6b, 0xfe, + 0x63, 0x46, 0x6d, 0x36, 0x1e, 0x32, 0x25, 0x15, 0x15, 0x25, 0x32, 0x1d, 0x36, 0x6e, 0x46, 0x01, + 0x9d, 0xfe, 0xb7, 0x01, 0x49, 0xfd, 0x52, 0x1c, 0x14, 0x0f, 0x24, 0x22, 0x1d, 0x0a, 0x08, 0x1c, + 0x22, 0x26, 0x10, 0x14, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xe2, + 0x02, 0xb6, 0x00, 0x29, 0x00, 0x64, 0x40, 0x41, 0x1d, 0x20, 0x0c, 0x00, 0x4d, 0x40, 0x16, 0x50, + 0x16, 0x02, 0x16, 0x52, 0x29, 0x20, 0x1f, 0x30, 0x1f, 0x02, 0x1f, 0x52, 0x1c, 0x29, 0x1c, 0x29, + 0x1c, 0x2a, 0x2b, 0x80, 0x2b, 0x90, 0x2b, 0xa0, 0x2b, 0x03, 0x0d, 0x20, 0x09, 0x30, 0x09, 0x02, + 0x09, 0x52, 0xc0, 0x0a, 0xd0, 0x0a, 0x02, 0x0a, 0x2a, 0x19, 0x52, 0x24, 0x07, 0x1e, 0x0a, 0x05, + 0x52, 0x10, 0x0b, 0x0c, 0x01, 0x0b, 0x00, 0x09, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, + 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x11, 0x23, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0xcc, 0x04, 0x09, 0x10, 0x0c, 0x0d, 0x14, 0x07, 0x60, 0x60, 0x0c, 0x1d, 0x0c, 0x29, 0x31, 0x1a, + 0x08, 0x10, 0x1c, 0x1b, 0x0f, 0x60, 0x0a, 0x1e, 0x36, 0x2c, 0x2c, 0x37, 0x1e, 0x0b, 0x01, 0x20, + 0x21, 0x28, 0x17, 0x07, 0x08, 0x03, 0xfe, 0x84, 0x02, 0xa1, 0x15, 0xe4, 0x05, 0x09, 0x1b, 0x33, + 0x48, 0x2d, 0x5e, 0x3e, 0x34, 0x34, 0x3e, 0x01, 0x17, 0xfe, 0xeb, 0x31, 0x4d, 0x34, 0x1c, 0x1c, + 0x34, 0x4d, 0x31, 0x00, 0x00, 0x01, 0x00, 0x20, 0xff, 0xf3, 0x01, 0xce, 0x02, 0x6b, 0x00, 0x15, + 0x00, 0x3c, 0xb9, 0x00, 0x08, 0xff, 0xc0, 0x40, 0x20, 0x09, 0x00, 0x4d, 0x10, 0x08, 0x20, 0x08, + 0x02, 0x08, 0x17, 0x0f, 0x15, 0x1f, 0x15, 0x02, 0x15, 0x00, 0x44, 0x11, 0x10, 0x13, 0x16, 0x11, + 0x00, 0x48, 0x14, 0x02, 0x07, 0x04, 0x4a, 0x0b, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x32, + 0x01, 0x10, 0xd6, 0xc4, 0xd5, 0xfd, 0xc5, 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x2b, 0x01, 0x11, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x23, + 0x35, 0x21, 0x15, 0x01, 0x0f, 0x24, 0x2d, 0x15, 0x30, 0x11, 0x18, 0x14, 0x3a, 0x34, 0x37, 0x47, + 0x2a, 0x10, 0x74, 0x01, 0x77, 0x02, 0x05, 0xfe, 0xb4, 0x31, 0x28, 0x0c, 0x07, 0x65, 0x09, 0x12, + 0x20, 0x37, 0x48, 0x29, 0x01, 0x4a, 0x66, 0x66, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x00, 0x13, 0x00, 0x70, 0xb9, 0x00, 0x05, 0xff, 0xc0, 0x40, 0x40, 0x0b, 0x00, 0x4d, + 0x0e, 0x0e, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x51, 0x07, 0x06, 0x06, 0x07, 0x05, 0x10, 0x08, 0x30, + 0x08, 0x40, 0x08, 0x50, 0x08, 0x04, 0x08, 0x14, 0x12, 0x11, 0x51, 0x02, 0x10, 0x00, 0x30, 0x00, + 0x40, 0x00, 0x50, 0x00, 0x04, 0x00, 0x14, 0x13, 0x08, 0x0a, 0x02, 0x0c, 0x07, 0x48, 0x09, 0x10, + 0x03, 0x48, 0x0d, 0x06, 0x06, 0x00, 0x09, 0x02, 0x11, 0x02, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xed, + 0x32, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x10, 0xed, 0x32, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0x5d, 0xd5, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xc6, 0xc5, 0x32, 0x2f, 0x10, 0xed, 0x32, 0x2f, 0x10, + 0xc5, 0x32, 0x2f, 0x31, 0x30, 0x2b, 0x33, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, + 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x36, 0x87, 0x5a, 0x5a, 0x87, 0x01, + 0x89, 0x86, 0x5a, 0x5a, 0x86, 0x66, 0xa9, 0x63, 0x93, 0x66, 0x66, 0x93, 0x63, 0xa9, 0x66, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x0a, 0x02, 0x78, 0x00, 0x1f, 0x00, 0x52, 0xb2, 0x00, + 0x44, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0b, 0x0e, 0x48, 0x1f, 0x15, 0x21, 0x1c, 0x1c, 0x0a, + 0x05, 0x44, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, 0x0e, 0x48, 0x07, 0x20, 0x16, 0x18, 0xad, + 0x10, 0x03, 0x05, 0x0a, 0x1c, 0x0a, 0x1c, 0x05, 0x03, 0x06, 0x08, 0x02, 0x06, 0x08, 0x00, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xd6, 0x2b, 0xfd, 0xc0, 0x32, 0x3d, 0x2f, 0x18, 0x10, 0xd6, 0xd6, 0x2b, 0xed, 0x31, 0x30, + 0x21, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, + 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x07, 0x07, 0x16, 0x16, 0x17, 0x01, 0x5d, 0x0b, 0x24, 0x30, + 0x38, 0x1e, 0x7b, 0x7b, 0x6a, 0x10, 0x1f, 0x21, 0x24, 0x14, 0x0b, 0x18, 0x1b, 0x1f, 0x13, 0x36, + 0x15, 0x15, 0x11, 0x17, 0x0e, 0x5f, 0x47, 0x6d, 0x20, 0x1e, 0x4e, 0x4e, 0x48, 0x19, 0xfe, 0xe5, + 0x02, 0x6b, 0xfe, 0xff, 0x9a, 0x17, 0x2a, 0x20, 0x13, 0x02, 0x0b, 0x15, 0x12, 0x56, 0x11, 0x14, + 0x13, 0x8a, 0x42, 0xb1, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, + 0x02, 0xb5, 0x00, 0x25, 0x00, 0x5e, 0x40, 0x21, 0x1f, 0x00, 0x06, 0x01, 0x06, 0x11, 0x10, 0x10, + 0x20, 0x10, 0x30, 0x10, 0x50, 0x10, 0x60, 0x10, 0x70, 0x10, 0x06, 0x10, 0x27, 0x0b, 0x00, 0x16, + 0x44, 0x50, 0x18, 0x60, 0x18, 0x70, 0x18, 0x03, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x09, 0x0c, + 0x48, 0x18, 0x26, 0x23, 0x57, 0x1c, 0xa6, 0x17, 0x06, 0x00, 0x16, 0x0b, 0x16, 0x0b, 0x00, 0x03, + 0x05, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, + 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xc0, 0xc5, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, + 0x5d, 0xc6, 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, + 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, + 0x22, 0x15, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, + 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x4c, 0x5b, 0x0c, 0x1f, 0x14, 0x11, + 0x0a, 0x13, 0x0b, 0x31, 0x01, 0x1c, 0x15, 0x2f, 0x32, 0x2f, 0x15, 0x17, 0x36, 0x38, 0x34, 0x16, + 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x02, 0x10, 0x55, 0x50, 0x03, + 0x08, 0x5f, 0x02, 0x04, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xea, + 0x02, 0xb5, 0x00, 0x1b, 0x00, 0x48, 0x40, 0x14, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, + 0x04, 0x00, 0x1d, 0x14, 0x12, 0x11, 0x51, 0x0d, 0x09, 0x0c, 0x0e, 0x0b, 0xb8, 0xff, 0xc0, 0x40, + 0x13, 0x09, 0x0e, 0x48, 0x0b, 0x1c, 0x09, 0x14, 0x73, 0x0c, 0x11, 0x0d, 0x48, 0x10, 0x9f, 0x1b, + 0x18, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xd5, 0x32, 0xed, 0x32, 0x01, 0x10, + 0xd6, 0x2b, 0xc6, 0xd5, 0x32, 0x32, 0xfd, 0xc5, 0x33, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x25, 0x0e, + 0x03, 0x23, 0x22, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, + 0x23, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xea, 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, + 0x4e, 0x81, 0x81, 0x82, 0xfe, 0x84, 0x84, 0x26, 0x1d, 0x24, 0x32, 0x08, 0x14, 0x02, 0x0a, 0x0b, + 0x08, 0x65, 0x61, 0x80, 0x55, 0xbf, 0x66, 0xfe, 0xdb, 0x55, 0x89, 0x30, 0x22, 0x14, 0x03, 0x00, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xdd, 0x02, 0xb5, 0x00, 0x2a, 0x00, 0x4b, 0x40, 0x29, + 0x16, 0x19, 0x1c, 0x1a, 0x1b, 0x05, 0x11, 0x2a, 0x29, 0x00, 0x28, 0x04, 0x05, 0x0b, 0x0b, 0x11, + 0x06, 0x6f, 0x05, 0x2c, 0x21, 0x22, 0x10, 0x6f, 0x11, 0x2b, 0x28, 0x1c, 0x19, 0x00, 0x1a, 0x73, + 0x1b, 0x1f, 0x57, 0x25, 0xa6, 0x10, 0x06, 0x06, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xd6, 0xed, + 0x32, 0x32, 0x32, 0x32, 0x01, 0x10, 0xd6, 0xed, 0xd6, 0xc5, 0x10, 0xd6, 0xed, 0x12, 0x39, 0x3d, + 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, + 0x27, 0x0e, 0x03, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, + 0x23, 0x22, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x01, 0x30, 0x1c, 0x36, + 0x2d, 0x23, 0x0b, 0x8e, 0x08, 0x14, 0x15, 0x16, 0x0a, 0x0e, 0x1d, 0x1b, 0x16, 0x07, 0x88, 0x11, + 0x2d, 0x30, 0x33, 0x17, 0x04, 0x06, 0x04, 0x6b, 0x1c, 0x62, 0x0c, 0x1e, 0x16, 0x1e, 0x13, 0x15, + 0x11, 0x30, 0x20, 0x31, 0x4b, 0x1e, 0x6d, 0x1b, 0x02, 0x14, 0x42, 0x94, 0x90, 0x81, 0x2d, 0x24, + 0x51, 0x52, 0x4e, 0x21, 0x24, 0x52, 0x52, 0x4f, 0x1f, 0x40, 0x7d, 0x74, 0x68, 0x2c, 0x0b, 0x13, + 0x08, 0x26, 0x4a, 0x23, 0x0e, 0x0c, 0x08, 0x62, 0x05, 0x0a, 0x28, 0x31, 0x27, 0x4a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x14, 0xff, 0xf4, 0x01, 0xe4, 0x02, 0x6b, 0x00, 0x26, 0x00, 0xa3, 0xb9, 0x00, + 0x16, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x15, + 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x14, + 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x0c, 0x00, 0x4d, 0x1c, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x15, 0xb8, + 0xff, 0x80, 0x40, 0x41, 0x0e, 0x00, 0x4d, 0x24, 0x07, 0x34, 0x07, 0x02, 0x07, 0x52, 0x06, 0x24, + 0x14, 0x44, 0x14, 0x02, 0x14, 0x52, 0x13, 0x20, 0x1d, 0x30, 0x1d, 0x02, 0x02, 0x1d, 0x52, 0x1c, + 0x90, 0x13, 0x01, 0x81, 0x13, 0x01, 0x80, 0x1c, 0x90, 0x1c, 0x02, 0x06, 0x13, 0x1c, 0x1c, 0x13, + 0x06, 0x03, 0x27, 0x28, 0x13, 0x14, 0x13, 0x14, 0x1c, 0x18, 0x4a, 0x21, 0x07, 0x1c, 0x06, 0x07, + 0x06, 0x0d, 0x4a, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x5d, 0x10, 0xed, 0x5f, 0x5d, + 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, + 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x06, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x9a, 0x29, 0x34, 0x1e, 0x0b, 0x64, 0x08, 0x0d, 0x12, 0x09, + 0x0b, 0x15, 0x08, 0x06, 0x64, 0x15, 0x1a, 0x07, 0x12, 0x0a, 0x64, 0x2d, 0x49, 0x1e, 0x1d, 0x2b, + 0x11, 0x11, 0x32, 0x0c, 0x1b, 0x32, 0x48, 0x2d, 0x01, 0xb5, 0xfe, 0x46, 0x1c, 0x22, 0x13, 0x06, + 0x07, 0x04, 0x25, 0x34, 0xc2, 0xcf, 0x30, 0x27, 0x03, 0x04, 0x02, 0x0a, 0xfd, 0xa1, 0x0b, 0x0d, + 0x0d, 0x0f, 0x0a, 0x12, 0x00, 0x01, 0xff, 0xbc, 0xff, 0x59, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x1c, + 0x00, 0x56, 0x40, 0x36, 0x2f, 0x19, 0x3f, 0x19, 0x02, 0x19, 0x52, 0xcf, 0x1b, 0xdf, 0x1b, 0x02, + 0x1b, 0x40, 0x0b, 0x10, 0x48, 0x1b, 0x1e, 0x03, 0x52, 0x0f, 0x13, 0x1f, 0x13, 0x02, 0x13, 0x1d, + 0x0c, 0x0f, 0x12, 0x1f, 0x12, 0x02, 0x12, 0x1d, 0x0f, 0x1d, 0x01, 0x19, 0x03, 0x19, 0x03, 0x00, + 0x1a, 0x02, 0x13, 0x02, 0x0d, 0x10, 0x09, 0x92, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0xd5, 0xc6, 0x3f, + 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x01, 0x5d, 0x10, 0xd6, 0x5d, 0xcc, 0x10, 0xd6, 0x5d, 0xed, + 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x21, 0x26, 0x26, 0x27, 0x11, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, + 0x33, 0x11, 0x01, 0x63, 0x2a, 0x63, 0x39, 0x0c, 0x20, 0x3a, 0x2d, 0x0d, 0x2b, 0x16, 0x12, 0x0e, + 0x10, 0x11, 0x31, 0x63, 0x1c, 0x38, 0x35, 0x2d, 0x10, 0x6f, 0x67, 0xcd, 0x67, 0xfe, 0x77, 0x29, + 0x43, 0x32, 0x1b, 0x04, 0x08, 0x63, 0x05, 0x02, 0x3f, 0x02, 0x6b, 0x2c, 0x67, 0x66, 0x60, 0x24, + 0x01, 0x7d, 0xfd, 0x95, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x01, 0xe0, 0x00, 0x13, + 0x00, 0x2c, 0xb6, 0x0b, 0x51, 0x08, 0x15, 0x11, 0x51, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, + 0x0c, 0x48, 0x00, 0x14, 0x12, 0x06, 0x0a, 0x10, 0x09, 0x10, 0x0e, 0x57, 0x03, 0x07, 0x00, 0x3f, + 0xed, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x23, 0x3f, 0x21, 0x61, 0x39, 0x38, 0x4a, 0x2b, 0x12, 0x7b, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, + 0x01, 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0x52, 0x01, 0x9e, 0x42, 0x3a, 0x02, 0x02, + 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x00, 0x0b, + 0x00, 0x16, 0x00, 0x21, 0x00, 0x74, 0x40, 0x1f, 0x8f, 0x00, 0x9f, 0x00, 0x02, 0x00, 0x1c, 0x10, + 0x1c, 0x02, 0x00, 0x12, 0x10, 0x12, 0x02, 0x60, 0x1d, 0x70, 0x1d, 0x02, 0x60, 0x11, 0x70, 0x11, + 0x02, 0x00, 0x06, 0x10, 0x06, 0x02, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0f, 0x12, 0x48, 0x00, + 0x1c, 0x12, 0x1d, 0x11, 0x06, 0x06, 0x11, 0x1d, 0x12, 0x1c, 0x00, 0x06, 0x22, 0x23, 0x2f, 0x0c, + 0x3f, 0x0c, 0x02, 0x0c, 0x4a, 0x09, 0x9e, 0x11, 0x48, 0x7f, 0x1c, 0x01, 0x1c, 0x40, 0x0a, 0x0d, + 0x48, 0x1c, 0x20, 0x17, 0x30, 0x17, 0x02, 0x17, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xfd, 0x5d, 0xd6, + 0x2b, 0x5d, 0xed, 0x3f, 0xed, 0x5d, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2b, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x17, 0x32, 0x3e, 0x02, 0x37, 0x23, 0x1e, 0x03, 0x13, 0x22, + 0x0e, 0x02, 0x07, 0x33, 0x2e, 0x03, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0xdf, + 0x1b, 0x24, 0x16, 0x0a, 0x02, 0xc2, 0x01, 0x0a, 0x16, 0x25, 0x1b, 0x1b, 0x23, 0x17, 0x0b, 0x01, + 0xc2, 0x02, 0x0a, 0x16, 0x24, 0x01, 0x36, 0xa0, 0xa3, 0xa3, 0xa0, 0xa0, 0xa3, 0xa3, 0x38, 0x1a, + 0x2d, 0x3e, 0x24, 0x25, 0x3e, 0x2d, 0x19, 0x01, 0xb0, 0x19, 0x2c, 0x3d, 0x23, 0x23, 0x3d, 0x2c, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xf1, 0x02, 0xcb, 0x00, 0x19, + 0x00, 0x2d, 0x00, 0x28, 0x40, 0x15, 0x24, 0x53, 0x14, 0x08, 0x64, 0x0e, 0x2f, 0x1a, 0x53, 0x00, + 0x2e, 0x1f, 0x4a, 0x17, 0x09, 0x0b, 0x8a, 0x29, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, + 0x32, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x35, 0x33, 0x16, 0x15, 0x14, 0x06, 0x07, 0x23, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x1b, 0x76, 0x69, 0x4d, 0x32, 0x07, 0x05, 0x01, 0x69, 0x04, + 0x1c, 0x22, 0x01, 0x27, 0x74, 0x6a, 0x6d, 0x73, 0x7d, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, + 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x01, 0x36, 0xa0, 0xa3, 0x28, 0x12, 0x28, + 0x15, 0x0b, 0x15, 0x0b, 0x17, 0x19, 0x2a, 0x4a, 0x20, 0x50, 0x81, 0xa0, 0xa3, 0xa3, 0xa0, 0x2d, + 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xec, 0x02, 0x34, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x32, + 0x40, 0x1e, 0x27, 0x53, 0x00, 0x14, 0x52, 0x00, 0x1b, 0x20, 0x1b, 0x40, 0x1b, 0x60, 0x1b, 0x04, + 0x1b, 0x2e, 0x21, 0x53, 0x0a, 0x2d, 0x18, 0xae, 0x2a, 0x57, 0x0f, 0x07, 0x24, 0x57, 0x05, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, + 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x17, 0x36, 0x36, 0x35, 0x34, 0x34, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, + 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xd8, 0x20, 0x3a, + 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, 0x46, 0x32, 0x07, 0x0a, 0x02, 0x66, + 0x03, 0x01, 0x1f, 0x1a, 0x11, 0x14, 0xfe, 0xc2, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x32, 0x30, 0x31, + 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, 0x42, 0x5b, 0x38, 0x37, 0x5b, 0x41, 0x23, 0x22, 0x0c, 0x1f, + 0x18, 0x0b, 0x17, 0x0f, 0x0e, 0x1a, 0x0d, 0x2a, 0x3c, 0x1d, 0x1d, 0x49, 0x2b, 0x3f, 0x4e, 0x4e, + 0x3f, 0x3f, 0x4d, 0x4d, 0x00, 0x02, 0x00, 0x1e, 0xff, 0xf3, 0x01, 0xdc, 0x02, 0x79, 0x00, 0x25, + 0x00, 0x39, 0x00, 0x43, 0xb9, 0x00, 0x11, 0xff, 0xc0, 0x40, 0x27, 0x15, 0x18, 0x48, 0x11, 0x52, + 0x12, 0x1c, 0x79, 0x26, 0x30, 0x79, 0x00, 0x00, 0x10, 0x00, 0x02, 0x80, 0x00, 0x90, 0x00, 0xa0, + 0x00, 0x03, 0x00, 0x3a, 0x35, 0x4a, 0x21, 0x09, 0x12, 0x08, 0x18, 0x4a, 0x0b, 0x03, 0x2b, 0x4a, + 0x05, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xfd, + 0xd6, 0xfd, 0xd6, 0xed, 0x2b, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x36, + 0x36, 0x33, 0x32, 0x16, 0x16, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, + 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x37, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x1e, 0x10, 0x22, 0x37, 0x26, 0x1b, 0x2c, + 0x11, 0x15, 0x2c, 0x1b, 0x34, 0x34, 0x13, 0x01, 0x60, 0x05, 0x0b, 0x10, 0x0c, 0x13, 0x0f, 0x0f, + 0x11, 0x24, 0x36, 0x24, 0x25, 0x36, 0x23, 0x11, 0xbc, 0x02, 0x09, 0x12, 0x10, 0x10, 0x12, 0x08, + 0x02, 0x02, 0x09, 0x11, 0x10, 0x10, 0x12, 0x09, 0x02, 0x01, 0x37, 0x60, 0x7d, 0x48, 0x1d, 0x0f, + 0x13, 0x13, 0x0f, 0x34, 0x54, 0x6b, 0x37, 0xfe, 0xb1, 0x01, 0x95, 0x28, 0x30, 0x1a, 0x09, 0x13, + 0x47, 0x7f, 0x60, 0x7e, 0x49, 0x1d, 0x1d, 0x49, 0x7e, 0x60, 0x3e, 0x54, 0x32, 0x15, 0x15, 0x33, + 0x53, 0x3e, 0x3f, 0x53, 0x33, 0x15, 0x15, 0x33, 0x54, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, + 0xff, 0x5b, 0x01, 0xe2, 0x01, 0xe2, 0x00, 0x23, 0x00, 0x37, 0x00, 0x5f, 0x40, 0x0d, 0xc0, 0x1a, + 0x01, 0x1a, 0x52, 0x10, 0x1b, 0x01, 0x1b, 0xd0, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x1e, + 0x0b, 0x0e, 0x48, 0x00, 0x52, 0x50, 0x33, 0x60, 0x33, 0x70, 0x33, 0xe0, 0x33, 0xf0, 0x33, 0x05, + 0x33, 0x20, 0x29, 0x30, 0x29, 0x02, 0x29, 0x52, 0xa0, 0x0a, 0xb0, 0x0a, 0x02, 0x0a, 0xb8, 0xff, + 0xc0, 0x40, 0x10, 0x16, 0x1c, 0x48, 0x0a, 0x38, 0x1b, 0x92, 0x14, 0x07, 0x10, 0x0f, 0x01, 0x0f, + 0x07, 0x05, 0x0b, 0x00, 0x3f, 0x3f, 0x71, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x71, 0xfd, 0x5d, + 0xd6, 0x5d, 0xfd, 0x2b, 0x5d, 0xd6, 0x71, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x22, 0x07, 0x16, 0x27, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x01, 0x48, 0x10, 0x25, 0x3b, + 0x2a, 0x2a, 0x39, 0x24, 0x10, 0x10, 0x25, 0x3b, 0x2a, 0x32, 0x20, 0x13, 0x2a, 0x16, 0x1b, 0x32, + 0x27, 0x18, 0x60, 0x14, 0x23, 0x05, 0x0b, 0x06, 0x13, 0x99, 0x0b, 0x13, 0x0f, 0x09, 0x09, 0x0f, + 0x14, 0x0b, 0x0b, 0x13, 0x0f, 0x09, 0x09, 0x0f, 0x14, 0xec, 0x3a, 0x5b, 0x40, 0x22, 0x22, 0x3f, + 0x5c, 0x3a, 0x37, 0x5b, 0x40, 0x24, 0x1a, 0x0b, 0x0d, 0x10, 0x29, 0x47, 0x37, 0xfe, 0x32, 0x01, + 0xb0, 0x3d, 0x34, 0x01, 0x3a, 0x3b, 0x0b, 0x20, 0x38, 0x2d, 0x2e, 0x39, 0x1f, 0x0b, 0x0b, 0x20, + 0x39, 0x2d, 0x2d, 0x39, 0x1f, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x72, 0x00, 0x19, 0x00, 0x24, 0x00, 0x4d, 0xb9, 0x00, 0x12, 0xff, 0xc0, 0x40, 0x12, 0x0f, + 0x10, 0x00, 0x4c, 0x2f, 0x22, 0x3f, 0x22, 0x02, 0x22, 0x64, 0x05, 0x26, 0x1e, 0x09, 0x52, 0x0b, + 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0b, 0x0e, 0x48, 0x10, 0x64, 0x15, 0x25, 0x1e, 0x48, 0x09, + 0x09, 0x00, 0x0a, 0x08, 0x13, 0x0c, 0x0c, 0x1d, 0x48, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x32, 0x10, + 0xc4, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd0, 0xfd, 0x2b, 0xdc, 0xfd, 0xc0, 0x10, 0xd6, + 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, 0x23, + 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x17, 0x22, 0x22, + 0x07, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xfa, 0x3b, 0x54, 0x36, 0x19, 0x5f, 0x60, 0x18, + 0x69, 0x05, 0x1d, 0x19, 0x0a, 0x5a, 0x0d, 0x27, 0x43, 0x5b, 0x61, 0x05, 0x17, 0x09, 0x1e, 0x22, + 0x2b, 0x26, 0x02, 0x72, 0x16, 0x31, 0x4f, 0x39, 0x6f, 0x63, 0xd1, 0x02, 0x10, 0x1e, 0x14, 0x1e, + 0x17, 0x0c, 0x28, 0x22, 0x2b, 0x36, 0x1f, 0x0b, 0x62, 0x02, 0xd2, 0x2c, 0x3c, 0x36, 0x36, 0x00, + 0x00, 0x02, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x02, 0xb5, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x31, + 0x40, 0x1a, 0x1f, 0x46, 0x12, 0x00, 0x2d, 0x19, 0x26, 0x07, 0x51, 0x09, 0x2c, 0x22, 0x57, 0x1c, + 0x0b, 0x13, 0x15, 0x57, 0x0f, 0xa6, 0x08, 0x92, 0x29, 0x57, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, + 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xd0, 0xc0, 0x10, 0xd6, 0xc4, 0xed, 0x31, + 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x15, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x36, 0x32, 0x33, 0x32, 0x16, 0x07, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0xd5, 0x18, 0x2e, 0x46, + 0x2e, 0x2f, 0x32, 0x7b, 0x17, 0x2a, 0x39, 0x22, 0x12, 0x21, 0x16, 0x11, 0x14, 0x0e, 0x18, 0x1f, + 0x0e, 0x1e, 0x0e, 0x6d, 0x74, 0x7d, 0x32, 0x33, 0x0e, 0x20, 0x0b, 0x0c, 0x28, 0x14, 0x2c, 0x2a, + 0xeb, 0x36, 0x5b, 0x41, 0x24, 0x17, 0xb1, 0x02, 0xb2, 0x30, 0x41, 0x27, 0x10, 0x04, 0x05, 0x60, + 0x05, 0x18, 0x27, 0x34, 0x02, 0x84, 0x75, 0x3f, 0x51, 0x03, 0x01, 0xfe, 0xfe, 0x08, 0x0a, 0x47, + 0x00, 0x02, 0x00, 0x36, 0xff, 0xa0, 0x02, 0x09, 0x02, 0xb5, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x49, + 0x40, 0x12, 0x13, 0x0e, 0x44, 0x08, 0x0d, 0x28, 0x1c, 0x46, 0x00, 0x05, 0x01, 0x05, 0x28, 0x19, + 0x22, 0x14, 0x44, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0b, 0x0e, 0x48, 0x16, 0x27, 0x17, 0xa6, + 0x23, 0x48, 0x14, 0x14, 0x00, 0x15, 0x08, 0x0e, 0x87, 0x1f, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0xd0, 0xc0, 0x10, 0xd6, + 0x5d, 0xed, 0x10, 0xd6, 0xc5, 0xfd, 0xc6, 0x31, 0x30, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x32, + 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0xd6, 0x35, 0x56, 0x3e, 0x21, + 0x2f, 0x37, 0x1c, 0x34, 0x2d, 0x25, 0x0d, 0x82, 0x0b, 0x21, 0x2a, 0x30, 0x19, 0x37, 0x7b, 0x7b, + 0x0a, 0x13, 0x75, 0x3c, 0x31, 0x07, 0x14, 0x0a, 0x1b, 0x3f, 0x38, 0x02, 0x72, 0x18, 0x32, 0x4d, + 0x34, 0x39, 0x59, 0x16, 0x2a, 0x5f, 0x5e, 0x56, 0x22, 0x1e, 0x50, 0x59, 0x58, 0x25, 0xe4, 0x02, + 0xb5, 0x44, 0x01, 0xca, 0x31, 0x2e, 0x01, 0x02, 0xba, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, + 0xff, 0xf3, 0x01, 0xcc, 0x02, 0x79, 0x00, 0x30, 0x00, 0x49, 0xb9, 0x00, 0x03, 0xff, 0xc0, 0x40, + 0x27, 0x0d, 0x00, 0x4d, 0x16, 0x46, 0x22, 0x20, 0x04, 0x30, 0x04, 0x02, 0x04, 0x32, 0x2c, 0x46, + 0x1c, 0x40, 0x0c, 0x50, 0x0c, 0x02, 0x0c, 0x31, 0x1b, 0x18, 0x4a, 0x1f, 0x27, 0x4a, 0x11, 0x11, + 0x09, 0x1f, 0x03, 0x03, 0x00, 0x4a, 0x09, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x10, + 0xed, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xd6, 0xed, 0x31, + 0x30, 0x00, 0x2b, 0x25, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, + 0x02, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x0c, 0x36, 0x4b, 0x1b, + 0x24, 0x0b, 0x22, 0x2f, 0x3d, 0x27, 0x73, 0x71, 0x22, 0x34, 0x40, 0x1d, 0x13, 0x27, 0x1f, 0x14, + 0x62, 0x28, 0x3c, 0x1a, 0x24, 0x1d, 0x55, 0x39, 0x63, 0x71, 0x20, 0x32, 0x3b, 0x1c, 0x15, 0x2a, + 0x22, 0x16, 0x09, 0x18, 0x29, 0x5a, 0x1c, 0x10, 0x64, 0x07, 0x11, 0x0e, 0x09, 0x5f, 0x57, 0x33, + 0x43, 0x2d, 0x1b, 0x0b, 0x07, 0x10, 0x15, 0x1b, 0x12, 0x47, 0x14, 0x0e, 0x5f, 0x10, 0x1a, 0x62, + 0x57, 0x2c, 0x3b, 0x28, 0x1a, 0x0a, 0x08, 0x13, 0x17, 0x1e, 0x13, 0x0f, 0x1d, 0x17, 0x0d, 0x00, + 0x00, 0x01, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, 0x01, 0xe2, 0x00, 0x33, 0x00, 0x6f, 0x40, 0x0b, + 0x1c, 0x28, 0x14, 0x00, 0x4d, 0x1c, 0x20, 0x13, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0xb3, 0x09, + 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x2c, + 0x0d, 0x10, 0x00, 0x4c, 0x16, 0x53, 0x27, 0x04, 0x35, 0x31, 0x53, 0x1f, 0x10, 0x0c, 0x01, 0x0c, + 0x34, 0x50, 0x11, 0x60, 0x11, 0x02, 0x11, 0x57, 0x2c, 0x2c, 0x22, 0x07, 0x1e, 0x4f, 0x19, 0x01, + 0x19, 0x57, 0x22, 0x0b, 0x03, 0x40, 0x00, 0x01, 0x00, 0x57, 0x07, 0x07, 0x00, 0x3f, 0xfd, 0x5d, + 0xc6, 0x3f, 0xfd, 0x5d, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xc4, + 0xed, 0x10, 0xd6, 0xd6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x32, 0x36, + 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x03, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x01, 0x0c, 0x28, 0x50, 0x22, 0x14, 0x1a, 0x56, + 0x3d, 0x3c, 0x52, 0x33, 0x16, 0x1e, 0x2f, 0x39, 0x1b, 0x13, 0x21, 0x1a, 0x0f, 0x21, 0x2f, 0x16, + 0x2a, 0x23, 0x1b, 0x08, 0x14, 0x1d, 0x50, 0x2e, 0x35, 0x4c, 0x31, 0x17, 0x1e, 0x2e, 0x38, 0x1b, + 0x14, 0x22, 0x1b, 0x0f, 0x2f, 0x5d, 0x18, 0x0e, 0x67, 0x0b, 0x1c, 0x16, 0x26, 0x34, 0x1d, 0x25, + 0x33, 0x21, 0x16, 0x09, 0x06, 0x0d, 0x0e, 0x11, 0x0b, 0x0e, 0x16, 0x07, 0x09, 0x09, 0x03, 0x68, + 0x0d, 0x0e, 0x17, 0x29, 0x35, 0x1e, 0x25, 0x31, 0x20, 0x15, 0x08, 0x06, 0x0c, 0x0d, 0x12, 0x0d, + 0x14, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xd6, 0x02, 0x6b, 0x02, 0x06, + 0x03, 0xa2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x59, 0x01, 0xcb, 0x02, 0xb9, 0x00, 0x1d, + 0x00, 0x2a, 0x00, 0x55, 0xb4, 0x1e, 0x52, 0x09, 0x51, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x09, + 0x0c, 0x48, 0x17, 0x00, 0x2c, 0xc0, 0x24, 0xd0, 0x24, 0x02, 0x24, 0xb8, 0xff, 0xc0, 0xb7, 0x0b, + 0x0e, 0x48, 0x24, 0x52, 0x11, 0x2b, 0x27, 0xb8, 0xff, 0x98, 0x40, 0x14, 0x0f, 0x49, 0x40, 0x27, + 0x50, 0x27, 0x02, 0x27, 0x55, 0x0c, 0x0c, 0x03, 0x21, 0x55, 0x14, 0xa6, 0x1d, 0x57, 0x03, 0x92, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd6, 0xed, 0x2b, + 0x5d, 0x10, 0xd6, 0xdc, 0x2b, 0xed, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, + 0x14, 0x1e, 0x02, 0x33, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x01, 0xcb, 0x0f, 0x23, 0x0d, 0x37, 0x47, 0x29, 0x10, 0x0b, 0x23, 0x1a, 0x1a, 0x2f, 0x25, + 0x16, 0x57, 0x4c, 0x4d, 0x57, 0x0b, 0x1b, 0x30, 0x25, 0xf6, 0x18, 0x1a, 0x18, 0x19, 0x1a, 0x17, + 0x0d, 0x1a, 0x0b, 0xa4, 0x02, 0x01, 0x1b, 0x30, 0x40, 0x26, 0x01, 0x9b, 0x06, 0x0c, 0x12, 0x24, + 0x34, 0x21, 0x49, 0x52, 0x5a, 0x62, 0xfe, 0x11, 0x15, 0x1f, 0x13, 0x09, 0x02, 0x60, 0x1a, 0x25, + 0x20, 0x16, 0x1b, 0x1e, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0x59, 0x01, 0xdd, + 0x02, 0x60, 0x00, 0x2d, 0x00, 0x51, 0x40, 0x0f, 0x0d, 0x13, 0x79, 0x40, 0x06, 0x01, 0x06, 0x2f, + 0x27, 0x40, 0x03, 0x01, 0x03, 0x2f, 0x2f, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x09, 0x0c, 0x48, 0x25, + 0x29, 0x51, 0x22, 0x1e, 0x20, 0x2e, 0x1f, 0x28, 0x48, 0x26, 0x06, 0x24, 0x08, 0x21, 0x06, 0x03, + 0x00, 0x57, 0x19, 0x07, 0x0d, 0x10, 0x09, 0x92, 0x00, 0x3f, 0xd5, 0xc6, 0x3f, 0xfd, 0xc6, 0x3f, + 0x3f, 0x3f, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0xd6, 0xc0, 0xfd, 0xc0, 0x2b, 0x10, 0xd6, 0x5d, 0xc6, + 0x10, 0xd6, 0x5d, 0xfd, 0xce, 0x31, 0x30, 0x25, 0x32, 0x36, 0x37, 0x16, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x34, 0x27, 0x06, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x14, 0x1e, 0x02, 0x01, 0x50, 0x27, 0x46, 0x14, 0x05, 0x07, 0x4f, 0x48, 0x0b, 0x35, 0x18, 0x10, + 0x0d, 0x28, 0x10, 0x18, 0x1c, 0x01, 0x05, 0x21, 0x0e, 0x2b, 0x44, 0x2f, 0x19, 0x67, 0x67, 0x7c, + 0xc1, 0xc1, 0x0b, 0x13, 0x1b, 0x60, 0x0a, 0x08, 0x26, 0x3b, 0x25, 0x4c, 0x47, 0x07, 0x08, 0x57, + 0x05, 0x06, 0x16, 0x1b, 0x03, 0x0b, 0x05, 0x01, 0x02, 0x13, 0x2e, 0x4f, 0x3b, 0xb0, 0x66, 0x76, + 0x14, 0x8a, 0x66, 0xbe, 0x1a, 0x20, 0x12, 0x06, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x00, 0x11, 0x00, 0x24, 0x40, 0x12, 0x0d, 0x0e, 0x44, 0x10, 0x05, 0x08, 0x12, 0x0f, + 0x08, 0x0e, 0x48, 0x0c, 0x02, 0x06, 0x11, 0x48, 0x0b, 0x02, 0x00, 0x3f, 0xfd, 0xc4, 0x3f, 0xed, + 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0xd4, 0xfd, 0xc5, 0x31, 0x30, 0x13, 0x22, 0x06, 0x15, 0x14, 0x17, + 0x07, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0xb3, 0x27, 0x1e, 0x08, + 0x5f, 0x0d, 0x5f, 0x6a, 0x01, 0x08, 0x91, 0x7c, 0x02, 0x05, 0x1c, 0x19, 0x12, 0x1d, 0x0d, 0x2e, + 0x27, 0x45, 0x3d, 0x66, 0xfd, 0xfb, 0x02, 0x05, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xe0, + 0x02, 0xb5, 0x00, 0x29, 0x00, 0x43, 0x40, 0x27, 0x0c, 0x21, 0x2b, 0x16, 0x17, 0x14, 0x51, 0x03, + 0x29, 0x01, 0x2a, 0x20, 0x1b, 0x57, 0x24, 0x07, 0x20, 0x17, 0x30, 0x17, 0x02, 0x17, 0x55, 0x15, + 0x0a, 0x0d, 0x10, 0x57, 0x09, 0x01, 0x20, 0x00, 0x30, 0x00, 0x02, 0x00, 0x55, 0x02, 0x0a, 0x00, + 0x3f, 0xed, 0x5d, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x5d, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xc6, + 0xd5, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x33, 0x15, 0x23, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x8b, 0x67, 0x67, 0x18, 0x33, 0x4e, 0x37, 0x2a, 0x42, 0x12, 0x1a, 0x14, 0x2e, 0x14, 0x38, 0x2a, + 0xc1, 0xc1, 0x1f, 0x2a, 0x13, 0x20, 0x1d, 0x1e, 0x11, 0x11, 0x22, 0x50, 0x2c, 0x2a, 0x44, 0x30, + 0x19, 0x01, 0x70, 0x66, 0x19, 0x2d, 0x4a, 0x33, 0x1c, 0x0e, 0x07, 0x6b, 0x08, 0x07, 0x2d, 0x23, + 0x1e, 0x66, 0xb4, 0x34, 0x28, 0x03, 0x07, 0x0a, 0x08, 0x69, 0x0f, 0x0f, 0x13, 0x2e, 0x4f, 0x3b, + 0x00, 0x01, 0x00, 0x19, 0xff, 0x59, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x11, 0x00, 0x3b, 0x40, 0x22, + 0x60, 0x0b, 0x01, 0x0b, 0x13, 0x0f, 0x04, 0x01, 0x04, 0x05, 0x44, 0x0f, 0x00, 0x01, 0x00, 0x0f, + 0x11, 0x01, 0x11, 0xd0, 0x01, 0x01, 0x01, 0x12, 0x0a, 0x08, 0x57, 0x0e, 0x92, 0x05, 0x00, 0x48, + 0x02, 0x02, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xc6, 0x5d, 0xd5, + 0x5d, 0xfd, 0xc5, 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x13, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, + 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0xbc, 0xa3, 0x01, 0xc2, 0xa3, + 0x31, 0x1a, 0x16, 0x11, 0x16, 0x2b, 0x0d, 0x4f, 0x51, 0x02, 0x05, 0x66, 0x66, 0xfe, 0x03, 0x44, + 0x07, 0x66, 0x08, 0x04, 0x58, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0xff, 0xf3, 0x02, 0x01, + 0x02, 0xcb, 0x00, 0x22, 0x00, 0x34, 0x40, 0x1e, 0x13, 0x40, 0x0e, 0x00, 0x4d, 0x0e, 0x44, 0x1e, + 0x13, 0xa9, 0x1a, 0x24, 0x08, 0x44, 0x40, 0x05, 0x01, 0x05, 0x23, 0x1d, 0x16, 0x8a, 0x0f, 0x02, + 0x07, 0x02, 0x0b, 0x74, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xc4, 0x01, 0x10, 0xd6, + 0x5d, 0xed, 0x10, 0xd4, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, + 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, + 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x11, 0x14, 0x0e, 0x02, 0xdd, 0x35, 0x46, 0x2a, 0x11, + 0x73, 0x1f, 0x26, 0x25, 0x21, 0x33, 0x27, 0x1a, 0x01, 0x01, 0x66, 0x02, 0x02, 0x2d, 0x3d, 0x12, + 0x2b, 0x47, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x8b, 0xfe, 0x74, 0x4e, 0x3c, 0x3e, 0x4d, 0x01, + 0x8b, 0x20, 0x1d, 0x08, 0x12, 0x09, 0x0c, 0x17, 0x0b, 0x2f, 0x3d, 0x09, 0xfe, 0xb8, 0x36, 0x58, + 0x3e, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0xff, 0xf5, 0x01, 0xe8, 0x02, 0x34, 0x00, 0x20, + 0x00, 0x31, 0x40, 0x1c, 0x04, 0x40, 0x0b, 0x0e, 0x00, 0x4c, 0x20, 0x51, 0x0f, 0x07, 0x52, 0x0b, + 0x22, 0x1a, 0x51, 0x17, 0x21, 0x18, 0x07, 0x1d, 0x57, 0x12, 0x0b, 0x0e, 0x07, 0xa8, 0x00, 0x07, + 0x00, 0x3f, 0x3f, 0xc4, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xd4, 0xed, + 0x31, 0x30, 0x2b, 0x01, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, + 0x06, 0x07, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x01, 0x0e, 0x39, 0x23, 0x17, 0x01, 0x01, 0x66, 0x02, 0x01, 0x2d, 0x3b, 0x1e, + 0x59, 0x33, 0x35, 0x43, 0x26, 0x0f, 0x72, 0x18, 0x22, 0x0a, 0x25, 0x0a, 0x01, 0xd6, 0x02, 0x20, + 0x1b, 0x08, 0x10, 0x09, 0x0c, 0x15, 0x0b, 0x2f, 0x3d, 0x09, 0xfe, 0x7d, 0x09, 0x12, 0x20, 0x3b, + 0x50, 0x30, 0x01, 0x06, 0xff, 0x41, 0x3e, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0xff, 0xf3, 0x01, 0xeb, 0x02, 0x6c, 0x00, 0x27, 0x00, 0x3c, 0x40, 0x23, 0x1e, 0x46, 0x00, 0x3f, + 0x22, 0x01, 0x22, 0x60, 0x24, 0xf0, 0x24, 0x02, 0x24, 0x29, 0x14, 0x46, 0x0a, 0x30, 0x10, 0x01, + 0x10, 0x0e, 0x28, 0x24, 0x48, 0x23, 0x02, 0x0e, 0x48, 0x0f, 0x02, 0x19, 0x4a, 0x05, 0x09, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xc5, 0x5d, 0xd6, 0xed, 0x10, 0xd6, 0x5d, + 0xc5, 0x5d, 0xd6, 0xed, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x23, 0x35, 0x33, 0x15, 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x26, 0x27, 0x35, 0x33, 0x15, 0x23, 0x16, 0x16, 0x01, 0xe6, 0x29, 0x42, 0x55, 0x2d, + 0x2c, 0x55, 0x42, 0x29, 0x22, 0x2b, 0x51, 0xd7, 0x22, 0x34, 0x0a, 0x19, 0x2b, 0x20, 0x20, 0x2b, + 0x1b, 0x0b, 0x31, 0x26, 0xd9, 0x55, 0x2b, 0x25, 0x01, 0x0a, 0x4b, 0x6a, 0x43, 0x1f, 0x1f, 0x43, + 0x6a, 0x4b, 0x41, 0x7f, 0x3c, 0x66, 0x57, 0x29, 0x77, 0x50, 0x27, 0x47, 0x38, 0x21, 0x21, 0x37, + 0x48, 0x27, 0x50, 0x77, 0x29, 0x57, 0x66, 0x3c, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x72, 0x00, 0x25, 0x00, 0x40, 0xb7, 0x23, 0x20, 0x0c, 0x00, 0x4d, + 0x1a, 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0d, 0x12, 0x48, 0x05, 0x27, 0x23, 0x0f, 0x44, + 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0d, 0x12, 0x48, 0x0e, 0x26, 0x0e, 0x02, 0x15, 0x4a, 0x08, + 0x09, 0x22, 0x1f, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0xc6, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x01, 0x18, 0x3a, 0x4a, 0x2c, + 0x11, 0x6b, 0x73, 0x3e, 0x51, 0x31, 0x14, 0x7c, 0x08, 0x12, 0x1f, 0x18, 0x22, 0x29, 0x16, 0x07, + 0x05, 0x11, 0x22, 0x1d, 0x09, 0x14, 0x08, 0x06, 0x0d, 0x22, 0x02, 0x72, 0x2a, 0x52, 0x7a, 0x50, + 0xa0, 0x99, 0x21, 0x3f, 0x5a, 0x38, 0x01, 0x86, 0xfe, 0x85, 0x29, 0x38, 0x22, 0x0f, 0x1e, 0x37, + 0x4c, 0x2d, 0x37, 0x52, 0x37, 0x1b, 0x03, 0x03, 0x6b, 0x03, 0x03, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x02, 0x07, 0x02, 0x74, 0x00, 0x1c, 0x00, 0x7c, 0xb9, 0x00, 0x16, 0xff, 0xc0, 0xb3, + 0x09, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xf0, 0xb3, 0x09, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xe0, 0xb3, + 0x09, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, + 0x2e, 0x0c, 0x00, 0x4d, 0x10, 0xaf, 0x08, 0xbf, 0x08, 0x02, 0x08, 0x11, 0x44, 0x16, 0x12, 0x17, + 0x1d, 0x13, 0x0f, 0x00, 0x1c, 0x03, 0x12, 0x1e, 0x13, 0x12, 0x13, 0x12, 0x1d, 0x1e, 0x13, 0x10, + 0x1c, 0x1c, 0x10, 0x13, 0x03, 0x12, 0x17, 0x02, 0x12, 0x08, 0x09, 0x0c, 0x4a, 0x05, 0x03, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x11, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x39, 0x10, 0xc6, 0xfd, 0xc6, 0x5d, 0x33, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x01, + 0x28, 0x0a, 0x13, 0x1c, 0x29, 0x1e, 0x1d, 0x2b, 0x17, 0x37, 0x07, 0x10, 0x09, 0x0e, 0x13, 0x09, + 0x5e, 0x7b, 0x33, 0x4d, 0x20, 0x83, 0x09, 0x16, 0x17, 0x1a, 0x0e, 0x01, 0xf1, 0x1b, 0x30, 0x23, + 0x15, 0x0d, 0x13, 0x58, 0x08, 0x05, 0x1a, 0x16, 0xec, 0xed, 0xeb, 0x60, 0xc4, 0x5c, 0x1f, 0x48, + 0x4b, 0x49, 0x20, 0x00, 0x00, 0x01, 0x00, 0x14, 0xff, 0x58, 0x01, 0xf9, 0x01, 0xdd, 0x00, 0x2c, + 0x00, 0x6b, 0xb9, 0x00, 0x2c, 0xff, 0xe0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x29, 0xb8, 0xff, 0xe0, + 0x40, 0x37, 0x0d, 0x0e, 0x00, 0x4c, 0x16, 0x20, 0x0d, 0x00, 0x4d, 0x15, 0x20, 0x10, 0x00, 0x4d, + 0x15, 0x18, 0x0e, 0x0f, 0x00, 0x4c, 0x00, 0x51, 0x2c, 0x2c, 0x2d, 0x29, 0x0f, 0x0b, 0x15, 0x03, + 0x1a, 0x2e, 0x29, 0x08, 0x1a, 0x05, 0x1a, 0x08, 0x05, 0x29, 0x04, 0x2d, 0x0e, 0x2e, 0x22, 0x2d, + 0x2c, 0x0a, 0x23, 0x26, 0x67, 0x1f, 0x0f, 0x0b, 0x0b, 0x00, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0x01, + 0x10, 0xc6, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x17, + 0x39, 0x11, 0x12, 0x39, 0x10, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x1e, 0x03, + 0x17, 0x36, 0x36, 0x37, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x0e, 0x03, 0x07, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x26, 0x26, 0x27, 0x98, 0x07, 0x14, 0x19, 0x1d, 0x11, 0x14, 0x14, 0x08, 0x0e, 0x38, 0x39, + 0x13, 0x26, 0x17, 0x15, 0x0c, 0x18, 0x07, 0x0e, 0x16, 0x06, 0x0c, 0x14, 0x15, 0x18, 0x11, 0x10, + 0x24, 0x2f, 0x3d, 0x29, 0x1c, 0x2a, 0x0e, 0x17, 0x11, 0x16, 0x0e, 0x20, 0x30, 0x0f, 0x3b, 0x4b, + 0x22, 0x01, 0xd6, 0x1d, 0x4c, 0x53, 0x58, 0x29, 0x4f, 0x6a, 0x22, 0x36, 0x33, 0x08, 0x0a, 0x61, + 0x06, 0x02, 0x14, 0x18, 0x30, 0x52, 0x4d, 0x4d, 0x2a, 0x27, 0x3f, 0x2b, 0x17, 0x0b, 0x08, 0x66, + 0x08, 0x08, 0x2a, 0x26, 0x73, 0xdf, 0x73, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x02, 0x6b, 0x00, 0x16, 0x00, 0xb1, 0x40, 0x0c, 0x16, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x12, 0x40, + 0x0a, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0xb4, 0x11, 0x12, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, + 0x40, 0x66, 0x0b, 0x00, 0x4d, 0x07, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x06, 0x20, 0x0d, 0x00, 0x4d, + 0x06, 0x60, 0x0c, 0x00, 0x4d, 0x06, 0x40, 0x0b, 0x00, 0x4d, 0x05, 0x40, 0x0b, 0x00, 0x4d, 0x03, + 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x01, 0x20, 0x0f, 0x00, 0x4d, 0x00, 0x40, 0x0a, 0x00, 0x4d, 0x0c, + 0x11, 0x10, 0x14, 0x15, 0x0f, 0x08, 0x12, 0x05, 0x13, 0x02, 0x04, 0x03, 0x00, 0x16, 0x09, 0x09, + 0x16, 0x00, 0x03, 0x04, 0x02, 0x13, 0x05, 0x12, 0x08, 0x0f, 0x15, 0x14, 0x10, 0x11, 0x0c, 0x10, + 0x17, 0x18, 0x16, 0x02, 0x14, 0x48, 0x15, 0x02, 0x0b, 0x08, 0x12, 0x02, 0x48, 0x0f, 0x40, 0x05, + 0x70, 0x05, 0x02, 0x05, 0x08, 0x48, 0x0a, 0x08, 0x00, 0x3f, 0xfd, 0xd6, 0x5d, 0xc0, 0xfd, 0xc0, + 0x3f, 0x3f, 0xed, 0x3f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x06, 0x07, 0x33, 0x15, 0x23, 0x06, 0x06, 0x07, + 0x21, 0x15, 0x21, 0x35, 0x36, 0x36, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x21, 0x01, 0xbd, + 0x3b, 0x30, 0x6a, 0xa4, 0x1a, 0x2d, 0x15, 0x01, 0x0a, 0xfe, 0x68, 0x16, 0x33, 0x20, 0x60, 0x98, + 0x5a, 0xee, 0x01, 0x82, 0x02, 0x15, 0x5a, 0x4e, 0x62, 0x2c, 0x52, 0x27, 0x66, 0x47, 0x2c, 0x60, + 0x38, 0x62, 0x98, 0x66, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, 0x01, 0xd6, 0x00, 0x18, + 0x00, 0xd3, 0xb9, 0x00, 0x11, 0xff, 0xc0, 0x40, 0x0e, 0x11, 0x00, 0x4d, 0x0f, 0x40, 0x0c, 0x00, + 0x4d, 0x06, 0x40, 0x0c, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x08, 0xb8, + 0xff, 0xc0, 0x40, 0x77, 0x0d, 0x00, 0x4d, 0x50, 0x0f, 0x01, 0x0f, 0x11, 0x12, 0xaf, 0x0c, 0x01, + 0xaf, 0x0b, 0x01, 0xb0, 0x16, 0xc0, 0x16, 0xd0, 0x16, 0x03, 0xb0, 0x17, 0xc0, 0x17, 0xd0, 0x17, + 0x03, 0xb0, 0x10, 0xc0, 0x10, 0xd0, 0x10, 0x03, 0x90, 0x11, 0xb0, 0x11, 0xc0, 0x11, 0xd0, 0x11, + 0x04, 0xbf, 0x05, 0x01, 0xbf, 0x04, 0x01, 0xc0, 0x0a, 0xd0, 0x0a, 0x02, 0xc0, 0x09, 0xd0, 0x09, + 0x02, 0x0c, 0x0b, 0x16, 0x17, 0x10, 0x11, 0x12, 0x08, 0x15, 0x06, 0x03, 0x05, 0x04, 0x00, 0x18, + 0x0a, 0x09, 0x09, 0x0a, 0x18, 0x00, 0x04, 0x05, 0x03, 0x06, 0x15, 0x08, 0x12, 0x11, 0x10, 0x17, + 0x16, 0x0b, 0x0c, 0x11, 0x19, 0x1a, 0x18, 0x0a, 0x05, 0x0f, 0x7d, 0x04, 0x11, 0x4f, 0x15, 0x01, + 0x15, 0x55, 0x17, 0x0a, 0x0b, 0x06, 0x08, 0x09, 0x55, 0x0a, 0x06, 0x00, 0x3f, 0xed, 0x32, 0x3f, + 0x3f, 0xfd, 0x5d, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x5d, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x06, 0x06, 0x07, 0x33, 0x15, 0x23, 0x06, 0x07, 0x33, 0x15, + 0x21, 0x35, 0x36, 0x36, 0x37, 0x23, 0x35, 0x33, 0x36, 0x36, 0x37, 0x23, 0x35, 0x21, 0x01, 0xaa, + 0x0e, 0x2d, 0x1b, 0x51, 0x8c, 0x26, 0x1d, 0xde, 0xfe, 0x8f, 0x12, 0x29, 0x15, 0x3f, 0x78, 0x12, + 0x22, 0x0f, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x0e, 0x37, 0x22, 0x4f, 0x33, 0x2d, 0x66, 0x4b, 0x1d, + 0x3f, 0x1f, 0x4f, 0x1a, 0x2d, 0x14, 0x66, 0x00, 0x00, 0x01, 0x00, 0x1a, 0xff, 0xf3, 0x01, 0xe1, + 0x02, 0x6b, 0x00, 0x26, 0x00, 0x51, 0xb9, 0x00, 0x1d, 0xff, 0xe0, 0x40, 0x29, 0x0f, 0x00, 0x4d, + 0x22, 0x53, 0x09, 0x60, 0x13, 0x01, 0x13, 0x28, 0x0e, 0x26, 0x1b, 0x05, 0x06, 0x1b, 0x27, 0x1c, + 0x1f, 0x4a, 0x16, 0x00, 0x73, 0x26, 0x09, 0x0e, 0x26, 0x26, 0x0e, 0x09, 0x03, 0x08, 0x16, 0x09, + 0x08, 0x02, 0x06, 0x48, 0x07, 0x02, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0x10, 0xed, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xd6, 0xc5, 0x10, 0xd4, 0xc5, 0x10, 0xd6, + 0x5d, 0xc4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x21, 0x35, 0x21, 0x15, 0x0e, + 0x03, 0x07, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0xa8, 0x11, 0x2b, 0x2b, 0x26, 0x0d, 0xfe, 0xf0, 0x01, + 0xa1, 0x0b, 0x27, 0x2e, 0x31, 0x14, 0x32, 0x44, 0x2a, 0x13, 0x8a, 0x79, 0x20, 0x3b, 0x33, 0x29, + 0x0d, 0x27, 0x1d, 0x4e, 0x31, 0x3c, 0x4a, 0x4b, 0x44, 0x2c, 0x01, 0x5e, 0x11, 0x2c, 0x2f, 0x2b, + 0x10, 0x66, 0x4b, 0x0e, 0x2e, 0x36, 0x36, 0x15, 0x08, 0x1e, 0x2c, 0x3a, 0x24, 0x66, 0x5a, 0x09, + 0x0e, 0x10, 0x07, 0x64, 0x0f, 0x18, 0x2b, 0x2b, 0x37, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, + 0xff, 0xf3, 0x01, 0xef, 0x02, 0x6b, 0x00, 0x24, 0x00, 0x72, 0x40, 0x10, 0x22, 0x20, 0x10, 0x00, + 0x4d, 0x22, 0x20, 0x0e, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0x40, + 0x38, 0x0c, 0x00, 0x4d, 0x20, 0x21, 0x01, 0x02, 0x20, 0x40, 0x10, 0x00, 0x4d, 0x20, 0x40, 0x0e, + 0x00, 0x4d, 0x20, 0x20, 0x01, 0x1f, 0x40, 0x10, 0x00, 0x4d, 0x30, 0x24, 0x01, 0x24, 0x1e, 0x0b, + 0x26, 0x1b, 0x04, 0x53, 0x13, 0x25, 0x16, 0x24, 0x00, 0x00, 0x24, 0x16, 0x03, 0x0e, 0x1e, 0x48, + 0x1d, 0x02, 0x1c, 0x02, 0x0a, 0x07, 0x4a, 0x0e, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xed, + 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, 0xd6, 0xc6, 0x5d, + 0x31, 0x30, 0x2b, 0x5d, 0x2b, 0x2b, 0x5f, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x23, 0x22, 0x06, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x2e, 0x03, 0x27, 0x35, 0x21, 0x15, 0x21, 0x1e, 0x03, 0x17, 0x01, 0x62, 0x23, 0x50, + 0x49, 0x42, 0x3b, 0x34, 0x54, 0x1d, 0x27, 0x1a, 0x69, 0x4a, 0x39, 0x5c, 0x42, 0x23, 0x50, 0x60, + 0x14, 0x2f, 0x2d, 0x25, 0x0b, 0x01, 0x97, 0xfe, 0xf8, 0x0d, 0x27, 0x2b, 0x2b, 0x11, 0x01, 0x1e, + 0x31, 0x34, 0x2b, 0x30, 0x18, 0x10, 0x63, 0x0e, 0x22, 0x17, 0x30, 0x4a, 0x33, 0x44, 0x5c, 0x11, + 0x15, 0x32, 0x30, 0x2b, 0x0e, 0x53, 0x66, 0x10, 0x2b, 0x2f, 0x2c, 0x11, 0x00, 0x01, 0x00, 0x36, + 0xff, 0x5b, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x22, 0x00, 0x56, 0xb5, 0x1e, 0x20, 0x0e, 0x00, 0x4d, + 0x15, 0xb8, 0xff, 0xe0, 0x40, 0x29, 0x1c, 0x00, 0x4d, 0x22, 0x1c, 0x24, 0x18, 0x1d, 0x1d, 0x23, + 0x00, 0x0b, 0x01, 0x0b, 0x24, 0x14, 0x19, 0x04, 0x53, 0x30, 0x11, 0x01, 0x11, 0x23, 0x00, 0x22, + 0x14, 0x14, 0x22, 0x00, 0x03, 0x0e, 0x1c, 0x48, 0x1b, 0x06, 0x0a, 0x07, 0x4a, 0x0e, 0x92, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xd6, 0x71, 0xed, + 0xd4, 0xc5, 0x10, 0xc6, 0x5d, 0x12, 0x39, 0x2f, 0x39, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x2b, 0x2b, + 0x25, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x27, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x03, 0x17, 0x01, + 0x66, 0x27, 0x40, 0x4c, 0x40, 0x38, 0x23, 0x53, 0x1d, 0x1b, 0x1f, 0x65, 0x33, 0x6f, 0x7d, 0x4d, + 0x58, 0x15, 0x2b, 0x28, 0x21, 0x0a, 0x01, 0x71, 0xd8, 0x0c, 0x22, 0x24, 0x24, 0x0f, 0x88, 0x2e, + 0x35, 0x30, 0x2f, 0x0f, 0x0d, 0x63, 0x0f, 0x15, 0x61, 0x63, 0x44, 0x5a, 0x12, 0x17, 0x32, 0x30, + 0x2b, 0x10, 0x53, 0x66, 0x10, 0x2d, 0x2e, 0x2d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x56, 0x01, 0xc1, 0x01, 0xd6, 0x00, 0x33, 0x00, 0x47, 0x40, 0x25, 0x19, 0x0a, 0x53, 0x23, + 0x35, 0x1e, 0x1e, 0x34, 0x35, 0x10, 0x16, 0x34, 0x2d, 0x53, 0x00, 0x34, 0x05, 0x0a, 0x31, 0x0f, + 0x10, 0x1e, 0x19, 0x19, 0x1e, 0x10, 0x0f, 0x04, 0x18, 0x31, 0x92, 0x18, 0x06, 0x16, 0x48, 0x17, + 0x06, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x12, 0x39, 0x39, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0x10, 0xd6, 0xed, 0xc4, 0x31, + 0x30, 0x17, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x35, 0x3e, 0x03, + 0x37, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0e, + 0x03, 0x15, 0x14, 0x16, 0x17, 0x07, 0x26, 0x26, 0x2d, 0x17, 0x2a, 0x3c, 0x24, 0x19, 0x2d, 0x23, + 0x15, 0x0d, 0x25, 0x43, 0x36, 0x0d, 0x22, 0x21, 0x1f, 0x0a, 0xe2, 0x01, 0x7a, 0x0c, 0x20, 0x22, + 0x23, 0x10, 0x22, 0x36, 0x25, 0x13, 0x1d, 0x38, 0x52, 0x35, 0x18, 0x1c, 0x0e, 0x04, 0x06, 0x05, + 0x64, 0x08, 0x11, 0x5b, 0x20, 0x2c, 0x1e, 0x15, 0x09, 0x06, 0x0b, 0x0e, 0x15, 0x10, 0x11, 0x1b, + 0x12, 0x09, 0x45, 0x0d, 0x20, 0x20, 0x1c, 0x0a, 0x66, 0x5b, 0x0c, 0x1f, 0x21, 0x20, 0x0f, 0x08, + 0x16, 0x21, 0x2f, 0x22, 0x27, 0x33, 0x23, 0x1a, 0x0e, 0x06, 0x0c, 0x0c, 0x0e, 0x07, 0x09, 0x1d, + 0x09, 0x13, 0x10, 0x25, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xc8, 0x02, 0x79, 0x00, 0x28, + 0x00, 0x77, 0xb9, 0x00, 0x12, 0xff, 0xe0, 0x40, 0x46, 0x19, 0x00, 0x4d, 0x22, 0x40, 0x0d, 0x0f, + 0x00, 0x4c, 0x21, 0x20, 0x0f, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x21, 0x20, 0x0d, 0x00, + 0x4d, 0x1a, 0x63, 0x00, 0x04, 0x20, 0x0a, 0x01, 0x0a, 0x2a, 0x14, 0x17, 0x06, 0x03, 0x03, 0x06, + 0x17, 0x14, 0x04, 0x29, 0x2a, 0x16, 0x15, 0x09, 0x63, 0x11, 0x23, 0x29, 0x22, 0x1d, 0x67, 0x26, + 0x05, 0x0c, 0x0c, 0x17, 0x40, 0x04, 0x01, 0x04, 0x65, 0x05, 0x15, 0x09, 0x65, 0x0b, 0x0c, 0x00, + 0x3f, 0xfd, 0xc4, 0xd6, 0xfd, 0x5d, 0xc0, 0x3f, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xd6, 0xed, + 0xd4, 0xc0, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x10, 0xd6, 0x5d, 0xd6, 0xd6, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x01, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, + 0x06, 0x06, 0x07, 0x21, 0x15, 0x21, 0x26, 0x26, 0x34, 0x34, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, + 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x01, 0xb6, 0x1c, 0x16, 0x3e, 0x9a, 0x2c, 0x42, 0x02, 0x01, 0x10, 0xfe, 0x66, 0x01, 0x01, + 0x38, 0x26, 0x49, 0xaf, 0x1e, 0x28, 0x2f, 0x25, 0x19, 0x29, 0x23, 0x1a, 0x0a, 0x3d, 0x27, 0x68, + 0x3c, 0x70, 0x5f, 0x01, 0xc8, 0x1f, 0x3a, 0x1d, 0x63, 0x29, 0x46, 0x1a, 0x66, 0x05, 0x10, 0x11, + 0x0e, 0x03, 0x36, 0x5a, 0x28, 0x63, 0x1d, 0x36, 0x1a, 0x28, 0x27, 0x0b, 0x10, 0x13, 0x09, 0x55, + 0x25, 0x28, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xcd, 0x02, 0x6b, 0x00, 0x20, + 0x00, 0x56, 0xb5, 0x14, 0x40, 0x0d, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe8, 0x40, 0x2a, 0x0d, 0x00, + 0x4d, 0x1b, 0x0f, 0x53, 0x00, 0x00, 0x01, 0x00, 0x22, 0x1c, 0x61, 0x14, 0x40, 0x09, 0x0c, 0x48, + 0x14, 0x08, 0x90, 0x17, 0x01, 0x17, 0x18, 0x21, 0x17, 0x1c, 0x65, 0x1a, 0x1f, 0x65, 0x14, 0x14, + 0x03, 0x1a, 0x04, 0x09, 0x0c, 0x67, 0x03, 0x0d, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x10, + 0xed, 0x10, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0xcd, 0x5d, 0xd6, 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0x5d, + 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x25, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x36, 0x36, 0x37, 0x23, 0x35, + 0x21, 0x15, 0x23, 0x06, 0x06, 0x07, 0x04, 0x01, 0xcd, 0x75, 0x76, 0x1b, 0x35, 0x2f, 0x24, 0x09, + 0x19, 0x19, 0x47, 0x30, 0x42, 0x3a, 0x1b, 0x3c, 0x62, 0x47, 0x08, 0x09, 0x04, 0x55, 0x01, 0xac, + 0xf2, 0x02, 0x04, 0x03, 0x01, 0x01, 0xbb, 0x5e, 0x6a, 0x07, 0x0b, 0x0b, 0x05, 0x69, 0x0b, 0x15, + 0x2f, 0x29, 0x1e, 0x2b, 0x1b, 0x0d, 0x40, 0x68, 0x36, 0x66, 0x66, 0x1d, 0x47, 0x1d, 0x0a, 0x00, + 0x00, 0x01, 0x00, 0x24, 0xff, 0xf3, 0x01, 0xc5, 0x01, 0xd6, 0x00, 0x23, 0x00, 0x5b, 0xb5, 0x16, + 0x40, 0x09, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, + 0x40, 0x27, 0x12, 0x00, 0x4d, 0x0f, 0x53, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x1c, 0x25, + 0x20, 0x52, 0x15, 0x06, 0x19, 0x24, 0x18, 0x4f, 0x1c, 0x01, 0x1c, 0x65, 0x1b, 0x20, 0x73, 0x14, + 0x14, 0x03, 0x1b, 0x0a, 0x07, 0x0c, 0x67, 0x03, 0x0d, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, + 0x2f, 0xed, 0x10, 0xfd, 0x5d, 0xc0, 0x01, 0x10, 0xd6, 0xc6, 0xd6, 0xed, 0x10, 0xc6, 0x5d, 0xd6, + 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x36, 0x36, 0x37, 0x23, + 0x35, 0x21, 0x15, 0x23, 0x06, 0x06, 0x07, 0x33, 0x32, 0x16, 0x01, 0xc5, 0x6e, 0x71, 0x3d, 0x5e, + 0x11, 0x16, 0x09, 0x1e, 0x27, 0x2e, 0x18, 0x32, 0x34, 0x0d, 0x22, 0x3c, 0x2f, 0x5a, 0x05, 0x08, + 0x03, 0x42, 0x01, 0x98, 0xf1, 0x01, 0x04, 0x02, 0x38, 0x5f, 0x6a, 0x93, 0x4c, 0x54, 0x13, 0x07, + 0x69, 0x03, 0x08, 0x07, 0x06, 0x17, 0x1d, 0x11, 0x18, 0x10, 0x08, 0x2c, 0x4b, 0x26, 0x66, 0x66, + 0x10, 0x28, 0x10, 0x47, 0x00, 0x01, 0x00, 0x35, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0x60, 0x00, 0x2b, + 0x00, 0x6b, 0xb9, 0x00, 0x0b, 0xff, 0xc0, 0xb5, 0x10, 0x00, 0x4d, 0x11, 0x53, 0x00, 0xb8, 0xff, + 0xc0, 0x40, 0x11, 0x0b, 0x11, 0x48, 0x00, 0x2d, 0x22, 0x1a, 0x51, 0x23, 0x20, 0x51, 0x1e, 0x0a, + 0x70, 0x1b, 0x01, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x0b, 0x0e, 0x48, 0x1b, 0x2c, 0x1a, 0x4f, + 0x22, 0x01, 0x22, 0x65, 0x1d, 0x30, 0x21, 0x01, 0x0f, 0x21, 0x01, 0x21, 0x0a, 0x27, 0x16, 0x27, + 0x16, 0x05, 0x1f, 0x02, 0x0b, 0x0e, 0x67, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, + 0x39, 0x2f, 0x2f, 0x3f, 0x5d, 0x5d, 0x33, 0xfd, 0x5d, 0xc0, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xc6, + 0xd4, 0xfd, 0xd0, 0xed, 0xc5, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x27, 0x26, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, + 0x16, 0x17, 0x1e, 0x03, 0x01, 0xd8, 0x1f, 0x39, 0x4f, 0x30, 0x1f, 0x38, 0x2d, 0x21, 0x08, 0x14, + 0x22, 0x4d, 0x2b, 0x25, 0x38, 0x13, 0x1e, 0x28, 0x15, 0x3c, 0x34, 0x4c, 0x4c, 0x7c, 0xb4, 0xb4, + 0x1c, 0x1d, 0x22, 0x3b, 0x2c, 0x19, 0x82, 0x23, 0x35, 0x24, 0x13, 0x0a, 0x0d, 0x0e, 0x04, 0x67, + 0x0e, 0x18, 0x0c, 0x15, 0x0e, 0x12, 0x0e, 0x0c, 0x08, 0x18, 0x4d, 0x38, 0x13, 0x66, 0x75, 0x15, + 0x8a, 0x66, 0x12, 0x17, 0x25, 0x0b, 0x0c, 0x17, 0x20, 0x2e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd3, 0x01, 0xe0, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x39, 0x40, 0x24, 0x09, 0x40, + 0x09, 0x00, 0x4d, 0x00, 0x53, 0x00, 0x0c, 0x20, 0x0c, 0x40, 0x0c, 0x03, 0x0c, 0x1b, 0x07, 0x11, + 0x51, 0x00, 0x13, 0x10, 0x13, 0x20, 0x13, 0x03, 0x13, 0x1a, 0x03, 0x57, 0x17, 0x0a, 0x07, 0x11, + 0x12, 0x0e, 0x00, 0x3f, 0xd5, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x10, 0xd6, + 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x3e, 0x03, 0x37, + 0x14, 0x0e, 0x02, 0x07, 0x15, 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x01, 0x54, 0x32, 0x2d, + 0x13, 0x1d, 0x0b, 0x27, 0x39, 0x27, 0x13, 0x7f, 0x2b, 0x4c, 0x67, 0x3b, 0x7b, 0x20, 0x5b, 0x3c, + 0x6b, 0x72, 0x01, 0x0f, 0x2d, 0x3b, 0x05, 0x02, 0xfe, 0xd6, 0x10, 0x24, 0x2f, 0x3d, 0x28, 0x43, + 0x62, 0x48, 0x35, 0x15, 0x7c, 0x02, 0x60, 0x0d, 0x18, 0x70, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbd, + 0xff, 0x5b, 0x01, 0x39, 0x02, 0xbb, 0x02, 0x06, 0x00, 0x5f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, + 0xff, 0x5b, 0x01, 0x99, 0x02, 0xbb, 0x02, 0x36, 0x00, 0x5f, 0x9f, 0x00, 0x00, 0x06, 0x00, 0x5f, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x16, 0xff, 0x5b, 0x01, 0xdd, 0x02, 0xbb, 0x00, 0x13, + 0x00, 0x64, 0x40, 0x3f, 0x0d, 0x40, 0x15, 0x00, 0x4d, 0x0c, 0x40, 0x15, 0x00, 0x4d, 0x09, 0x40, + 0x15, 0x00, 0x4d, 0x08, 0x40, 0x15, 0x00, 0x4d, 0x6f, 0x08, 0x01, 0x08, 0x07, 0x44, 0x04, 0x01, + 0x02, 0x13, 0x12, 0x0a, 0x0b, 0x6f, 0x0d, 0x01, 0x0d, 0x0e, 0x44, 0x10, 0x12, 0x14, 0x07, 0x04, + 0x48, 0x0a, 0x01, 0x00, 0x0b, 0x48, 0x11, 0x40, 0x0e, 0x60, 0x0e, 0xa0, 0x0e, 0x03, 0x0e, 0x0f, + 0x0e, 0x06, 0x8a, 0x00, 0x3f, 0x3f, 0xd5, 0x5d, 0xc0, 0xfd, 0xd0, 0xd6, 0xc0, 0xfd, 0xc0, 0x01, + 0x10, 0xd6, 0xd6, 0xfd, 0xc5, 0x5d, 0xd0, 0xc0, 0x10, 0xd0, 0xd0, 0xc5, 0xd5, 0xfd, 0xc5, 0x5d, + 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, + 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0xbd, 0xa7, 0xa7, 0x7c, 0xa4, 0xa4, + 0xa4, 0xa4, 0x7c, 0xa7, 0xe7, 0x51, 0x60, 0x01, 0x23, 0xfe, 0xdd, 0x60, 0x51, 0x60, 0xfe, 0xd4, + 0x01, 0x2c, 0x60, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xff, 0xf4, 0x01, 0x4d, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0xff, 0xfa, 0x02, 0x0a, 0x03, 0x2b, 0x00, 0x10, + 0x00, 0x22, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x92, 0x40, 0x23, 0x30, 0x34, 0x37, 0x16, 0x1f, 0x21, + 0x22, 0x17, 0x00, 0x21, 0x10, 0x21, 0x02, 0x21, 0x70, 0x20, 0x01, 0x20, 0x2f, 0x28, 0x3f, 0x28, + 0x02, 0x28, 0x52, 0x20, 0x00, 0x30, 0x00, 0x60, 0x00, 0x80, 0x00, 0x04, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x13, 0x15, 0x19, 0x48, 0x1f, 0x00, 0x01, 0x00, 0x10, 0x19, 0x80, 0x19, 0x02, 0x19, 0x17, + 0x37, 0x80, 0x23, 0x01, 0x23, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x18, 0x48, 0x23, 0xb8, 0xff, 0xc0, + 0x40, 0x1c, 0x0b, 0x0f, 0x48, 0x23, 0x52, 0x08, 0x36, 0x35, 0x32, 0x33, 0x31, 0xb0, 0x1f, 0xa4, + 0x21, 0x02, 0x17, 0xa4, 0x19, 0x08, 0x2d, 0xa5, 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc6, 0xdd, 0xcd, 0x01, 0x10, 0xd6, 0xed, 0x2b, + 0x2b, 0x5d, 0x10, 0xd6, 0xd5, 0x5d, 0xd6, 0x5d, 0x2b, 0x5d, 0xed, 0x5d, 0xde, 0x5d, 0xc0, 0x5d, + 0x10, 0xc0, 0x11, 0x39, 0x39, 0x10, 0xd6, 0xcc, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x37, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, + 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x07, 0x37, 0x37, 0x17, 0x37, 0x17, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, + 0x35, 0x17, 0x19, 0x2d, 0x15, 0x2a, 0x40, 0x2d, 0x17, 0xd0, 0x0c, 0x1e, 0x1e, 0x1e, 0x0c, 0x72, + 0xcb, 0x12, 0x1c, 0x19, 0x19, 0x10, 0x5e, 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, + 0x1e, 0x17, 0x08, 0x04, 0xaf, 0x22, 0x56, 0x55, 0x25, 0x7a, 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, + 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, 0x49, 0x79, 0x8c, 0x2a, 0x6e, 0x78, 0x7a, 0x36, 0x5d, + 0x4c, 0x48, 0x71, 0x66, 0x66, 0x3d, 0x5d, 0xfd, 0xed, 0x01, 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, + 0x01, 0xe6, 0x29, 0x3f, 0x40, 0x2b, 0x69, 0x00, 0x00, 0x04, 0x00, 0x12, 0xff, 0xfa, 0x02, 0x09, + 0x02, 0xa0, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x97, 0x40, 0x1e, 0x30, 0x34, + 0x37, 0x11, 0x17, 0x37, 0x1f, 0x1f, 0x01, 0x1f, 0x16, 0x19, 0x03, 0x37, 0x10, 0x1a, 0x01, 0x1a, + 0x1a, 0x36, 0x37, 0x20, 0xc0, 0x00, 0xd0, 0x00, 0xe0, 0x00, 0x03, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x13, 0x0b, 0x0e, 0x48, 0x00, 0x52, 0x40, 0x28, 0x50, 0x28, 0x02, 0x80, 0x28, 0x90, 0x28, 0xb0, + 0x28, 0x03, 0x28, 0x23, 0xb8, 0xff, 0xc0, 0xb3, 0x15, 0x1a, 0x48, 0x23, 0xb8, 0xff, 0xc0, 0x40, + 0x25, 0x0b, 0x10, 0x48, 0x23, 0x52, 0x30, 0x08, 0x40, 0x08, 0x50, 0x08, 0x03, 0x08, 0x36, 0x16, + 0xa4, 0x37, 0x35, 0x32, 0x33, 0xa0, 0x31, 0xa0, 0x20, 0xa4, 0x22, 0x0a, 0x18, 0x06, 0x2d, 0xa5, + 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, + 0xdd, 0xc5, 0x10, 0xec, 0x01, 0x10, 0xd6, 0x71, 0xfd, 0x2b, 0x2b, 0xd6, 0x5d, 0x71, 0xfd, 0x2b, + 0x5d, 0xce, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0x12, 0x17, 0x39, 0x5d, 0x10, 0xd6, 0xc0, 0x10, 0xd6, + 0xc4, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, + 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x37, 0x37, 0x17, 0x37, + 0x17, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, 0x35, 0x17, 0x19, 0x2d, 0x15, 0x2a, 0x40, + 0x2d, 0x17, 0xd0, 0x0c, 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, 0x17, 0x0e, 0x5b, + 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, 0x1e, 0x17, 0x08, 0x04, 0xaf, 0x21, 0x56, + 0x55, 0x25, 0x7a, 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, + 0x49, 0x79, 0x0d, 0x1d, 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, 0x50, 0x48, 0x45, 0x25, 0x5d, + 0xfe, 0x82, 0x01, 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, 0x01, 0x5b, 0x29, 0x40, 0x41, 0x2b, 0x6a, + 0x00, 0x04, 0x00, 0x09, 0xff, 0xf3, 0x02, 0x09, 0x02, 0xb5, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x30, + 0x00, 0x36, 0x00, 0xad, 0x40, 0x1d, 0x2f, 0x40, 0x0d, 0x00, 0x4d, 0x2e, 0x40, 0x0d, 0x00, 0x4d, + 0x10, 0x20, 0x0f, 0x00, 0x4d, 0x31, 0x04, 0x35, 0x01, 0x35, 0x21, 0x38, 0x15, 0x1e, 0x15, 0x1e, + 0x37, 0x17, 0x27, 0xb8, 0xff, 0xc0, 0xb7, 0x16, 0x19, 0x48, 0xc2, 0x27, 0x01, 0x02, 0x27, 0xb8, + 0xff, 0xc0, 0x40, 0x4b, 0x0b, 0x10, 0x48, 0x27, 0x52, 0x2f, 0x06, 0x01, 0x06, 0x37, 0x2f, 0x0d, + 0x4f, 0x0d, 0x02, 0x0d, 0x2f, 0x2e, 0x3f, 0x2e, 0x5f, 0x2e, 0xcf, 0x2e, 0x04, 0x2e, 0x52, 0x00, + 0x20, 0x19, 0x2f, 0x17, 0x4f, 0x17, 0x02, 0x0f, 0x17, 0x2f, 0x17, 0x4f, 0x17, 0x6f, 0x17, 0x8f, + 0x17, 0xaf, 0x17, 0x06, 0x17, 0x36, 0x33, 0x34, 0xa0, 0x32, 0xa0, 0x1e, 0xa4, 0x21, 0x0a, 0x15, + 0xa4, 0x18, 0x06, 0x0f, 0x01, 0x0e, 0x00, 0x22, 0xa5, 0x0b, 0x0b, 0x2c, 0xa5, 0x03, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xdd, 0xc5, 0x01, 0x2f, + 0x5d, 0x71, 0xd5, 0xc6, 0xde, 0xfd, 0x5d, 0xc0, 0x5d, 0x10, 0xd6, 0x71, 0xed, 0x2b, 0x5f, 0x5d, + 0x2b, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xc6, 0xd6, 0x71, 0xc4, 0x31, 0x30, 0x2b, 0x2b, + 0x2b, 0x25, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x35, 0x37, + 0x13, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x05, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x11, 0x26, 0x37, 0x37, 0x17, 0x37, 0x17, + 0x07, 0x01, 0x08, 0x1f, 0x33, 0x1a, 0x4a, 0x49, 0x0e, 0x1c, 0x2b, 0x1d, 0x19, 0x1d, 0x57, 0xe3, + 0x0c, 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, 0x17, 0x0e, 0x5b, 0xb9, 0xfe, 0xa2, + 0x0e, 0x11, 0x09, 0x04, 0x03, 0x0b, 0x17, 0x14, 0x0c, 0x0b, 0x16, 0x7d, 0x21, 0x56, 0x55, 0x25, + 0x7a, 0x0e, 0x0e, 0x0d, 0x86, 0x74, 0x34, 0x5a, 0x40, 0x25, 0x11, 0xd3, 0x13, 0xfe, 0xcf, 0x1d, + 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, 0x50, 0x48, 0x45, 0x25, 0x5d, 0x53, 0x20, 0x31, 0x3e, + 0x1e, 0x1a, 0x30, 0x26, 0x16, 0x05, 0x01, 0x1b, 0x13, 0xf3, 0x29, 0x40, 0x41, 0x2b, 0x6a, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf3, 0x01, 0xe1, 0x02, 0x6b, 0x00, 0x05, 0x00, 0x13, 0x00, 0x52, + 0x40, 0x39, 0x4f, 0x0b, 0x5f, 0x0b, 0xcf, 0x0b, 0xdf, 0x0b, 0x04, 0x0b, 0x52, 0x0e, 0x40, 0x09, + 0x14, 0x48, 0x0e, 0x15, 0x06, 0x00, 0x05, 0x01, 0x20, 0x05, 0x30, 0x05, 0x80, 0x05, 0xf0, 0x05, + 0x04, 0x05, 0x20, 0x04, 0x30, 0x04, 0xc0, 0x04, 0xd0, 0x04, 0x04, 0x04, 0x52, 0x01, 0x04, 0x55, + 0x14, 0x06, 0x4a, 0x13, 0x09, 0x0c, 0x02, 0x03, 0x02, 0x01, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0xed, 0x10, 0xec, 0x01, 0x2f, 0xfd, 0x5d, 0xd5, 0x5d, 0x71, 0xce, 0x10, 0xde, 0x2b, 0xed, 0x5d, + 0x31, 0x30, 0x33, 0x23, 0x11, 0x33, 0x11, 0x33, 0x17, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, + 0x14, 0x0e, 0x02, 0x23, 0xfd, 0xeb, 0x57, 0x94, 0x2b, 0x15, 0x23, 0x1b, 0x0f, 0x57, 0x0e, 0x28, + 0x48, 0x3b, 0x02, 0x6b, 0xfd, 0xeb, 0x0e, 0x04, 0x11, 0x23, 0x20, 0x01, 0xcb, 0xfe, 0x48, 0x32, + 0x48, 0x2f, 0x17, 0x00, 0x00, 0x03, 0x00, 0x2d, 0xff, 0x56, 0x01, 0xe3, 0x02, 0x97, 0x00, 0x05, + 0x00, 0x17, 0x00, 0x23, 0x00, 0x6f, 0x40, 0x2e, 0x1e, 0x53, 0x18, 0x0f, 0x06, 0xdf, 0x0c, 0x01, + 0x0c, 0x52, 0x5f, 0x0f, 0x01, 0x0f, 0x25, 0x10, 0x05, 0x01, 0x20, 0x05, 0x60, 0x05, 0x70, 0x05, + 0xc0, 0x05, 0xe0, 0x05, 0xf0, 0x05, 0x06, 0x05, 0x30, 0x04, 0x40, 0x04, 0x50, 0x04, 0xc0, 0x04, + 0xd0, 0x04, 0x05, 0x04, 0x52, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x1b, 0x0b, 0x12, 0x48, 0x01, 0x24, + 0x1b, 0x53, 0xb0, 0x21, 0xd0, 0x21, 0x02, 0x21, 0x98, 0x06, 0x09, 0x4a, 0x14, 0x92, 0x0e, 0x0a, + 0x03, 0x02, 0x05, 0x55, 0x01, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0x5d, + 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0xc5, 0x5d, 0x71, 0x10, 0xd6, 0x5d, 0xfd, 0x5d, 0xc6, + 0x10, 0xd4, 0xed, 0x31, 0x30, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x07, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x31, 0xfe, 0xfc, 0x57, 0xad, 0x39, 0x0e, + 0x1d, 0x0e, 0x26, 0x20, 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, + 0x29, 0x29, 0x1a, 0x1c, 0x28, 0x02, 0x6b, 0xfd, 0xeb, 0x9e, 0x04, 0x05, 0x2d, 0x32, 0x01, 0xc8, + 0xfe, 0x43, 0x38, 0x4a, 0x2e, 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, 0x20, 0x25, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x37, 0xff, 0x56, 0x01, 0xd1, 0x02, 0xb5, 0x00, 0x11, + 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x9c, 0x40, 0x0d, 0x18, 0x53, 0x20, 0x12, 0x01, 0x11, 0x12, 0x01, + 0x00, 0x12, 0x01, 0x12, 0x06, 0xb8, 0xff, 0xc0, 0xb3, 0x15, 0x1b, 0x48, 0x06, 0xb8, 0xff, 0xc0, + 0x40, 0x5a, 0x0d, 0x10, 0x48, 0x06, 0xa4, 0x09, 0x40, 0x0d, 0x10, 0x48, 0x09, 0x2d, 0x6f, 0x2b, + 0x7f, 0x2b, 0xcf, 0x2b, 0xdf, 0x2b, 0x04, 0x2b, 0x40, 0x18, 0x1b, 0x48, 0x2b, 0x25, 0x40, 0x15, + 0x1b, 0x48, 0x25, 0x40, 0x0d, 0x10, 0x48, 0x25, 0xa4, 0x00, 0x23, 0x10, 0x23, 0x40, 0x23, 0x50, + 0x23, 0x60, 0x23, 0x05, 0x23, 0xd0, 0x00, 0xf0, 0x00, 0x02, 0x5f, 0x00, 0x6f, 0x00, 0x02, 0x00, + 0x2c, 0x25, 0x9f, 0x2b, 0x40, 0x0d, 0x10, 0x48, 0x2b, 0xa5, 0x1e, 0x07, 0x15, 0x53, 0x1b, 0x98, + 0x00, 0x03, 0x40, 0x0d, 0x10, 0x48, 0x03, 0xa5, 0x0e, 0x92, 0x08, 0x0a, 0x00, 0x3f, 0x3f, 0xfd, + 0x2b, 0xc6, 0x3f, 0xed, 0x3f, 0xed, 0x2b, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, 0x5d, 0xed, + 0x2b, 0x2b, 0xc4, 0x2b, 0x5d, 0x10, 0xd6, 0x2b, 0xed, 0x2b, 0x2b, 0xd4, 0x71, 0x71, 0x71, 0xed, + 0x31, 0x30, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, + 0x2e, 0x03, 0x35, 0x11, 0x37, 0x11, 0x14, 0x1e, 0x02, 0x17, 0xe6, 0x0e, 0x1d, 0x0e, 0x26, 0x20, + 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, 0x29, 0x29, 0x1a, 0x1c, + 0x28, 0xde, 0x3a, 0x49, 0x2a, 0x0f, 0x58, 0x0d, 0x1d, 0x2b, 0x1e, 0x48, 0x04, 0x05, 0x2d, 0x32, + 0x01, 0xc8, 0xfe, 0x43, 0x38, 0x4a, 0x2e, 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, + 0x20, 0x25, 0x25, 0xfd, 0x85, 0x01, 0x1a, 0x2c, 0x3a, 0x22, 0x02, 0x0c, 0x0f, 0xfe, 0x00, 0x21, + 0x28, 0x17, 0x09, 0x02, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf3, 0x01, 0xe1, 0x02, 0x6b, 0x00, 0x0d, + 0x00, 0x1b, 0x00, 0x52, 0x40, 0x34, 0x16, 0x40, 0x0e, 0x11, 0x48, 0x16, 0x8f, 0x13, 0x2f, 0x0e, + 0x3f, 0x0e, 0x4f, 0x0e, 0x03, 0x0e, 0x8f, 0x0c, 0x01, 0x0c, 0x8f, 0x0b, 0x40, 0x0d, 0x12, 0x48, + 0x0b, 0x90, 0x06, 0x01, 0x06, 0x8f, 0x07, 0x1c, 0x0e, 0xa5, 0x1b, 0x09, 0x14, 0x02, 0x0b, 0x02, + 0x05, 0x0a, 0x05, 0x0a, 0x09, 0x02, 0x06, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x39, + 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0x5d, 0xd4, 0x2b, 0xfd, 0x5d, 0xd6, + 0x5d, 0xd6, 0xed, 0x2b, 0x31, 0x30, 0x33, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x13, 0x11, + 0x33, 0x11, 0x37, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x07, 0xc7, 0x0f, + 0x17, 0x15, 0x16, 0x0d, 0x57, 0x4b, 0x5e, 0x57, 0x22, 0x12, 0x20, 0x17, 0x0d, 0x57, 0x0d, 0x25, + 0x44, 0x37, 0x3a, 0x5b, 0x59, 0x5e, 0x3d, 0xfe, 0x77, 0x02, 0x6b, 0xfe, 0x95, 0x01, 0x6b, 0xfd, + 0x95, 0x48, 0x06, 0x13, 0x22, 0x1d, 0x01, 0xcb, 0xfe, 0x48, 0x31, 0x47, 0x2f, 0x18, 0x01, 0x00, + 0x00, 0x03, 0x00, 0x12, 0xff, 0x56, 0x01, 0xd1, 0x02, 0x97, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x2b, + 0x00, 0x99, 0x40, 0x17, 0x20, 0x53, 0x1f, 0x26, 0x01, 0x26, 0x0c, 0x16, 0x40, 0x15, 0x1d, 0x48, + 0x16, 0x40, 0x0b, 0x11, 0x48, 0x16, 0x8f, 0x4f, 0x15, 0x01, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x50, + 0x12, 0x19, 0x48, 0x15, 0x0c, 0x40, 0x11, 0x00, 0x4d, 0x2f, 0x0c, 0x3f, 0x0c, 0x4f, 0x0c, 0x03, + 0x0c, 0x8f, 0x0b, 0x40, 0x17, 0x1a, 0x48, 0x0b, 0x40, 0x0d, 0x12, 0x48, 0x0b, 0x06, 0x40, 0x11, + 0x00, 0x4d, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x03, 0x06, 0x8f, 0x30, 0x07, 0x40, 0x07, 0x02, + 0x07, 0x9f, 0x0e, 0xaf, 0x0e, 0x02, 0x0e, 0x2c, 0x23, 0x53, 0x29, 0x98, 0x0e, 0x11, 0xa5, 0x1c, + 0x92, 0x15, 0x0a, 0x0d, 0x08, 0x0c, 0x02, 0x05, 0x0a, 0x05, 0x0a, 0x06, 0x09, 0x02, 0x06, 0x08, + 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, + 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x71, 0xfd, 0x71, 0x2b, 0xd4, 0x2b, 0x2b, 0xfd, 0x71, 0x2b, 0xd6, + 0x2b, 0x71, 0xed, 0x2b, 0x2b, 0x10, 0xd6, 0x71, 0xed, 0x31, 0x30, 0x33, 0x2e, 0x03, 0x27, 0x11, + 0x23, 0x11, 0x33, 0x13, 0x11, 0x33, 0x11, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0xc7, 0x0f, 0x17, 0x15, 0x16, 0x0d, 0x57, 0x4b, 0x5e, 0x57, 0x2c, 0x0e, + 0x1d, 0x0e, 0x26, 0x20, 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, + 0x29, 0x29, 0x1a, 0x1c, 0x28, 0x3a, 0x5b, 0x59, 0x5e, 0x3d, 0xfe, 0x77, 0x02, 0x6b, 0xfe, 0x95, + 0x01, 0x6b, 0xfd, 0x95, 0x48, 0x04, 0x05, 0x2d, 0x32, 0x01, 0xc8, 0xfe, 0x43, 0x38, 0x4a, 0x2e, + 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, 0x20, 0x25, 0x25, 0x00, 0x03, 0x00, 0x12, + 0xff, 0x56, 0x01, 0xe3, 0x02, 0x97, 0x00, 0x15, 0x00, 0x27, 0x00, 0x33, 0x00, 0xab, 0x40, 0x22, + 0x27, 0x40, 0x16, 0x00, 0x4d, 0x27, 0x40, 0x13, 0x00, 0x4d, 0x16, 0x40, 0x16, 0x00, 0x4d, 0x16, + 0x40, 0x13, 0x00, 0x4d, 0x2e, 0x53, 0x20, 0x28, 0x01, 0x02, 0x60, 0x28, 0x80, 0x28, 0xa0, 0x28, + 0x03, 0x28, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x17, 0x1a, 0x48, 0x28, 0x35, 0x1f, 0x40, 0x17, 0x1d, + 0x48, 0x1f, 0x40, 0x0d, 0x11, 0x48, 0x1f, 0x8f, 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x16, 0x1d, + 0x48, 0x1c, 0x09, 0x40, 0x19, 0x1d, 0x48, 0x09, 0x8f, 0x40, 0x0a, 0x50, 0x0a, 0x60, 0x0a, 0x03, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x29, 0x17, 0x1b, 0x48, 0x0a, 0x14, 0x40, 0x17, 0x1d, 0x48, 0x14, + 0x40, 0x0d, 0x11, 0x48, 0x14, 0x8f, 0x40, 0x15, 0x01, 0x15, 0x27, 0x34, 0x2b, 0x53, 0x31, 0x97, + 0x16, 0x19, 0xa5, 0x24, 0x92, 0x1d, 0x0b, 0x14, 0x06, 0x0a, 0x06, 0x10, 0xa5, 0x03, 0x0b, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0x71, 0xfd, + 0x2b, 0x2b, 0xd6, 0x2b, 0x5d, 0xfd, 0x2b, 0xd6, 0x2b, 0xed, 0x2b, 0x2b, 0x10, 0xd6, 0x2b, 0x5d, + 0x5f, 0x71, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x17, 0x16, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x12, 0x1a, 0x4b, 0x2d, 0x28, 0x37, + 0x21, 0x0f, 0x57, 0x09, 0x10, 0x18, 0x0f, 0x0f, 0x1f, 0x05, 0x57, 0xe6, 0x0e, 0x1d, 0x0e, 0x26, + 0x20, 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, 0x29, 0x29, 0x1a, + 0x1c, 0x28, 0x01, 0xc7, 0x09, 0x10, 0x14, 0x2a, 0x44, 0x30, 0xfe, 0xd2, 0x01, 0x26, 0x21, 0x28, + 0x16, 0x07, 0x08, 0x02, 0xfe, 0x7e, 0x48, 0x04, 0x05, 0x2d, 0x32, 0x01, 0xc8, 0xfe, 0x43, 0x38, + 0x4a, 0x2e, 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, 0x20, 0x25, 0x25, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x17, 0x1b, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x1c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x08, 0x2f, 0x33, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x34, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x0c, 0x10, 0x00, 0x06, 0x50, 0x01, 0x05, 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb3, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x5f, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xef, 0x40, 0x09, 0x14, + 0x18, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x20, 0x24, 0x14, 0x19, 0x50, 0x02, + 0x16, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x20, 0x24, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x25, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x1a, 0x1e, + 0x04, 0x14, 0x50, 0x01, 0x06, 0x1f, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, + 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x02, 0x13, 0x17, 0x07, 0x00, 0x50, 0x01, 0x09, 0x18, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x00, 0x19, + 0x00, 0x25, 0x00, 0x31, 0x00, 0x35, 0x00, 0x78, 0x40, 0x4f, 0x13, 0x44, 0x20, 0x14, 0x01, 0x14, + 0x37, 0xef, 0x34, 0x01, 0x34, 0xb0, 0x35, 0x01, 0x35, 0x36, 0x26, 0xb3, 0x2c, 0x1a, 0xb3, 0xcf, + 0x20, 0x01, 0x50, 0x20, 0x60, 0x20, 0x02, 0x4f, 0x20, 0x01, 0x20, 0x36, 0x07, 0x44, 0xa0, 0x06, + 0xb0, 0x06, 0x02, 0x06, 0x36, 0x2f, 0x34, 0x01, 0xdf, 0x34, 0xef, 0x34, 0xff, 0x34, 0x03, 0x34, + 0x99, 0x32, 0x86, 0x2f, 0xb2, 0xbf, 0x29, 0x01, 0x29, 0x02, 0x23, 0xb2, 0xbf, 0x1d, 0x01, 0x1d, + 0x02, 0x14, 0xb1, 0x07, 0xb1, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x5d, + 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x5d, 0x71, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, + 0x5d, 0x5d, 0xfd, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, + 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, + 0x15, 0x23, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, + 0x7b, 0x14, 0x32, 0x52, 0x56, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, + 0x63, 0xfe, 0xa5, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x5a, 0xfe, 0x9d, 0x36, + 0x58, 0x3e, 0x21, 0x02, 0xb3, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, + 0x1a, 0x1a, 0x1e, 0x1e, 0x7e, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xdc, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x1e, + 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x18, 0x1f, 0x07, 0x00, 0x50, 0x03, 0x09, 0x2d, 0x4f, 0x02, + 0x09, 0x21, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, + 0x00, 0x35, 0x00, 0x6b, 0x40, 0x47, 0x0f, 0x2c, 0x1f, 0x2c, 0x2f, 0x2c, 0x03, 0x2c, 0xb3, 0xbf, + 0x26, 0xdf, 0x26, 0x02, 0x26, 0x37, 0x12, 0x44, 0x00, 0x15, 0x20, 0x15, 0x02, 0x15, 0x37, 0x32, + 0x34, 0x36, 0x1a, 0xb3, 0x00, 0x20, 0x10, 0x20, 0x50, 0x20, 0xd0, 0x20, 0xe0, 0x20, 0x05, 0x20, + 0x36, 0x08, 0x44, 0x40, 0x05, 0x50, 0x05, 0x02, 0x05, 0x36, 0x33, 0x35, 0x86, 0x2f, 0xb2, 0x29, + 0x9e, 0x23, 0xb2, 0x1d, 0x9e, 0x14, 0xb1, 0x07, 0xb1, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, + 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x17, + 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, + 0x33, 0x11, 0x14, 0x0e, 0x02, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x07, 0x27, + 0x37, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, 0x7b, + 0x14, 0x32, 0x52, 0x76, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, + 0x22, 0x22, 0x17, 0x17, 0x22, 0x5f, 0x5d, 0x2d, 0x55, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x77, + 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x6e, 0xfe, 0x89, 0x36, 0x58, + 0x3e, 0x21, 0x02, 0xc9, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1e, 0x1e, 0x28, 0x45, 0x35, 0x50, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x03, 0x12, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x1e, + 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x1c, 0x23, 0x07, 0x00, 0x50, 0x03, 0x09, 0x25, 0x4f, 0x02, + 0x09, 0x19, 0x4f, 0x01, 0x09, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, + 0x00, 0x37, 0x00, 0xaa, 0xb9, 0x00, 0x31, 0xff, 0xe0, 0x40, 0x0e, 0x16, 0x00, 0x4d, 0x2d, 0x20, + 0x16, 0x00, 0x4d, 0x2b, 0x20, 0x16, 0x00, 0x4d, 0x27, 0xb8, 0xff, 0xe0, 0xb3, 0x16, 0x00, 0x4d, + 0x25, 0xb8, 0xff, 0xe0, 0x40, 0x0e, 0x16, 0x00, 0x4d, 0x21, 0x20, 0x16, 0x00, 0x4d, 0x1f, 0x20, + 0x16, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xe0, 0x40, 0x20, 0x16, 0x00, 0x4d, 0x2c, 0xb3, 0xdf, 0x26, + 0xef, 0x26, 0xff, 0x26, 0x03, 0x26, 0x39, 0x12, 0x44, 0x00, 0x15, 0x20, 0x15, 0x02, 0x15, 0x39, + 0x36, 0x32, 0x38, 0x1a, 0xb3, 0x50, 0x20, 0x01, 0x20, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x14, 0x1a, + 0x48, 0x20, 0x38, 0x08, 0x44, 0x40, 0x05, 0x50, 0x05, 0x02, 0x05, 0x38, 0x35, 0x86, 0x37, 0x34, + 0x33, 0x86, 0x2f, 0xb2, 0x29, 0x9e, 0x23, 0xb2, 0x1d, 0x9e, 0x14, 0xb1, 0x07, 0xb1, 0x0d, 0x4a, + 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xd5, 0xc5, 0x3f, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x2b, 0x5d, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, + 0x10, 0xd4, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, 0x22, + 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x0e, 0x02, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x37, 0x17, 0x37, + 0x17, 0x07, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, + 0x7b, 0x14, 0x32, 0x52, 0x76, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfd, 0x25, 0x31, 0x2f, 0x27, 0x56, 0x0d, 0x21, 0x3e, + 0x58, 0x36, 0x01, 0x77, 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x6e, + 0xfe, 0x89, 0x36, 0x58, 0x3e, 0x21, 0x02, 0xc9, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x3a, 0x2e, 0x23, 0x23, 0x2e, 0x4e, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x03, 0x00, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xab, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x18, 0x1f, + 0x07, 0x00, 0x50, 0x03, 0x09, 0x30, 0x4f, 0x02, 0x09, 0x21, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x3e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x35, 0x00, 0x9c, 0xb5, 0x31, 0x20, 0x16, + 0x00, 0x4d, 0x2d, 0xb8, 0xff, 0xe0, 0xb3, 0x16, 0x00, 0x4d, 0x2b, 0xb8, 0xff, 0xe0, 0x40, 0x0e, + 0x16, 0x00, 0x4d, 0x27, 0x20, 0x16, 0x00, 0x4d, 0x25, 0x20, 0x16, 0x00, 0x4d, 0x21, 0xb8, 0xff, + 0xe0, 0xb3, 0x16, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe0, 0x40, 0x44, 0x16, 0x00, 0x4d, 0x1b, 0x20, + 0x16, 0x00, 0x4d, 0x1a, 0xb3, 0xdf, 0x20, 0x01, 0x20, 0x37, 0x12, 0x44, 0x00, 0x15, 0x20, 0x15, + 0x30, 0x15, 0x03, 0x15, 0x37, 0x33, 0x0f, 0x35, 0x01, 0x35, 0x36, 0x2c, 0xb3, 0xb0, 0x26, 0xd0, + 0x26, 0xe0, 0x26, 0xf0, 0x26, 0x04, 0x26, 0x36, 0x08, 0x44, 0x05, 0x36, 0x34, 0x32, 0x86, 0x29, + 0xb2, 0x2f, 0x9e, 0x1d, 0xb2, 0x23, 0x9e, 0x14, 0xb1, 0x06, 0xb1, 0x0d, 0x4a, 0x00, 0x09, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, + 0x5d, 0xed, 0x10, 0xd4, 0x71, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0xed, 0x31, 0x30, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x11, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x17, 0x07, 0x27, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, + 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, 0x7b, 0x14, 0x32, 0x52, 0x22, 0x17, 0x18, 0x21, + 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0x93, 0x56, 0x2d, + 0x5e, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x77, 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, + 0x35, 0x27, 0x01, 0x6e, 0xfe, 0x89, 0x36, 0x58, 0x3e, 0x21, 0x02, 0xc9, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x9c, 0x50, 0x35, 0x45, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x03, 0x12, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x23, 0x1c, + 0x07, 0x00, 0x50, 0x03, 0x09, 0x2b, 0x4f, 0x02, 0x09, 0x1f, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x01, 0xe2, 0x00, 0x19, 0x00, 0x22, 0x00, 0x81, 0xb9, 0x00, 0x20, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x40, 0x0d, 0x00, 0x4d, 0x11, 0x40, 0x0d, 0x00, 0x4d, 0x10, + 0x40, 0x0d, 0x00, 0x4d, 0x0f, 0x40, 0x0d, 0x00, 0x4d, 0x0e, 0x40, 0x0d, 0x00, 0x4d, 0x0d, 0x40, + 0x0d, 0x00, 0x4d, 0x4f, 0x0c, 0x01, 0x0b, 0x22, 0x53, 0x20, 0x00, 0x40, 0x00, 0x50, 0x00, 0x03, + 0x00, 0x24, 0x1a, 0x53, 0x12, 0x70, 0x08, 0x01, 0x08, 0x23, 0x1a, 0x0b, 0x1a, 0x0b, 0x05, 0x0e, + 0x57, 0x15, 0x0b, 0x1f, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x00, 0x5d, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x37, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x05, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd1, 0x26, 0x3d, 0x50, 0x2a, 0x69, + 0x6c, 0x03, 0x01, 0x30, 0x4b, 0x3c, 0x25, 0x44, 0x16, 0x12, 0x20, 0x48, 0x2d, 0x3c, 0x5f, 0x43, + 0x24, 0xfe, 0xc5, 0x0a, 0x16, 0x23, 0x19, 0x2f, 0x2d, 0x04, 0xf0, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, + 0x76, 0x1a, 0x15, 0x2e, 0x34, 0x0f, 0x08, 0x68, 0x0c, 0x0e, 0x1f, 0x3d, 0x5a, 0x6d, 0x12, 0x24, + 0x1b, 0x11, 0x3b, 0x27, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x00, 0x0f, + 0x00, 0x1a, 0x00, 0x26, 0x00, 0x32, 0x00, 0x36, 0x01, 0x5f, 0xb5, 0x35, 0x40, 0x12, 0x00, 0x4d, + 0x32, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x32, 0xb8, 0xff, 0xe0, 0x40, 0x26, 0x17, 0x18, + 0x00, 0x4c, 0xd4, 0x32, 0x01, 0x2e, 0x20, 0x1b, 0x00, 0x4d, 0x2e, 0x20, 0x17, 0x00, 0x4d, 0xdb, + 0x2e, 0xfb, 0x2e, 0x02, 0x2c, 0x20, 0x1b, 0x00, 0x4d, 0x2c, 0x20, 0x17, 0x00, 0x4d, 0xdb, 0x2c, + 0xfb, 0x2c, 0x02, 0x28, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xe0, 0x40, + 0x09, 0x17, 0x00, 0x4d, 0xd4, 0x28, 0xf4, 0x28, 0x02, 0x26, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, + 0x4d, 0x26, 0xb8, 0xff, 0xe0, 0x40, 0x26, 0x17, 0x00, 0x4d, 0xd4, 0x26, 0xf4, 0x26, 0x02, 0x22, + 0x20, 0x1b, 0x00, 0x4d, 0x22, 0x20, 0x17, 0x18, 0x00, 0x4c, 0xdb, 0x22, 0x01, 0x20, 0x20, 0x1b, + 0x00, 0x4d, 0x20, 0x20, 0x17, 0x00, 0x4d, 0xdb, 0x20, 0xfb, 0x20, 0x02, 0x1c, 0xb8, 0xff, 0xe0, + 0xb3, 0x1b, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x17, 0x00, 0x4d, 0xd4, 0x1c, 0xf4, + 0x1c, 0x02, 0x05, 0xb8, 0xff, 0xe0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x05, 0xb8, 0xff, 0xc0, 0x40, + 0x66, 0x0b, 0x0c, 0x00, 0x4c, 0x2d, 0xb3, 0xc0, 0x27, 0x01, 0x5f, 0x27, 0x01, 0x40, 0x27, 0x01, + 0x27, 0x38, 0x10, 0x15, 0x16, 0x03, 0x02, 0x09, 0x15, 0x16, 0x0a, 0x01, 0x00, 0x00, 0x01, 0x0a, + 0x16, 0x15, 0x09, 0x02, 0x03, 0x08, 0x37, 0x0f, 0x38, 0x35, 0x36, 0x37, 0x1b, 0xb3, 0xe0, 0x21, + 0xf0, 0x21, 0x02, 0xcf, 0x21, 0x01, 0x50, 0x21, 0x60, 0x21, 0x70, 0x21, 0x03, 0x4f, 0x21, 0x01, + 0x21, 0x04, 0x37, 0xdf, 0x35, 0x01, 0x35, 0x99, 0xb0, 0x33, 0x01, 0x33, 0x86, 0x30, 0xb2, 0x00, + 0x2a, 0x01, 0x2a, 0x02, 0x24, 0xb2, 0x00, 0x1e, 0x01, 0x1e, 0x02, 0x15, 0x48, 0x02, 0x10, 0x02, + 0x10, 0x09, 0xb1, 0x03, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x39, 0x2f, 0x2f, 0xed, + 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0x5d, + 0x5d, 0x5d, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x10, 0xd6, 0x5d, 0x5d, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, + 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, + 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, 0x3e, 0x03, + 0x37, 0x33, 0x1e, 0x03, 0x17, 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x27, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x15, 0x23, 0x01, 0x67, 0x1d, 0xa5, 0x1c, 0x80, 0x16, 0x2d, + 0x2c, 0x2c, 0x15, 0x86, 0x16, 0x2c, 0x2b, 0x2b, 0x14, 0xf2, 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, + 0x06, 0x0c, 0x0f, 0x11, 0x24, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x7b, 0x7b, 0x5b, 0x9a, 0x89, 0x81, + 0x44, 0x44, 0x83, 0x8b, 0x99, 0x58, 0x01, 0xcb, 0x23, 0x39, 0x36, 0x37, 0x21, 0x21, 0x37, 0x36, + 0x39, 0xfe, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, + 0x1e, 0x7e, 0x47, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xdc, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x04, 0x03, + 0x02, 0x07, 0x34, 0x3b, 0x1c, 0x13, 0x50, 0x04, 0x0f, 0x49, 0x4f, 0x03, 0x0f, 0x3d, 0x4f, 0x02, + 0x0f, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x2a, 0x00, 0xab, + 0xb9, 0x00, 0x26, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x26, 0xb8, 0xff, 0xe0, 0x40, 0x1b, 0x16, + 0x18, 0x00, 0x4c, 0x22, 0x20, 0x1b, 0x00, 0x4d, 0x22, 0x20, 0x16, 0x18, 0x00, 0x4c, 0x20, 0x20, + 0x1b, 0x00, 0x4d, 0x20, 0x20, 0x16, 0x18, 0x00, 0x4c, 0x1c, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, + 0x4d, 0x1c, 0xb8, 0xff, 0xe0, 0x40, 0x41, 0x16, 0x18, 0x00, 0x4c, 0x10, 0x15, 0x16, 0x03, 0x02, + 0x09, 0x15, 0x16, 0x0a, 0x01, 0x00, 0x00, 0x01, 0x0a, 0x16, 0x15, 0x09, 0x02, 0x03, 0x08, 0x2b, + 0x0f, 0x2c, 0x28, 0x2a, 0x2b, 0x1b, 0xb3, 0x21, 0x04, 0x2b, 0xdf, 0x29, 0x01, 0x29, 0x99, 0x27, + 0x86, 0x24, 0xb2, 0xbf, 0x1e, 0x01, 0x00, 0x1e, 0x01, 0x1e, 0x02, 0x16, 0x48, 0x01, 0x10, 0x01, + 0x10, 0x01, 0x09, 0xb1, 0x03, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xed, 0x3f, 0x5d, 0x5d, 0xed, 0x3f, 0xe5, 0x5d, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xd6, + 0xc5, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, + 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x37, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x33, 0x15, 0x23, 0x01, 0x67, + 0x1d, 0xa5, 0x1c, 0x80, 0x16, 0x2d, 0x2c, 0x2c, 0x15, 0x86, 0x16, 0x2c, 0x2b, 0x2b, 0x14, 0xf2, + 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x30, 0x22, 0x17, 0x17, 0x22, 0x22, + 0x17, 0x17, 0x22, 0xad, 0xe8, 0xe8, 0x7b, 0x7b, 0x5b, 0x9a, 0x89, 0x81, 0x44, 0x44, 0x83, 0x8b, + 0x99, 0x58, 0x01, 0xcb, 0x23, 0x39, 0x36, 0x37, 0x21, 0x21, 0x37, 0x36, 0x39, 0xfe, 0x1a, 0x1e, + 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, 0x7e, 0x47, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0xdc, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x03, 0x02, 0x07, 0x3b, 0x3c, 0x1c, 0x13, 0x50, 0x03, 0x0f, 0x3d, 0x4f, 0x02, 0x0f, + 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x12, 0x02, 0x26, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x47, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x49, 0x19, 0x1a, 0x03, 0x11, 0x50, 0x02, 0x08, 0x1b, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, 0x02, 0x87, 0x02, 0x26, + 0x00, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x03, 0x05, + 0x50, 0x51, 0x25, 0x0a, 0x50, 0x03, 0x00, 0x52, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xdf, 0x02, 0x79, 0x00, 0x29, 0x00, 0x7f, 0xb9, 0x00, 0x26, 0xff, 0xc0, 0x40, + 0x4d, 0x0b, 0x0c, 0x00, 0x4c, 0x0e, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x0d, 0x40, 0x0b, 0x0c, 0x00, + 0x4c, 0x13, 0x40, 0x10, 0x11, 0x00, 0x4c, 0x11, 0x40, 0x18, 0x00, 0x4d, 0x10, 0x40, 0x18, 0x00, + 0x4d, 0x0e, 0x40, 0x10, 0x11, 0x00, 0x4c, 0x0f, 0x0d, 0x0c, 0x44, 0x12, 0x15, 0x26, 0xff, 0x14, + 0x01, 0x14, 0x2b, 0x05, 0x46, 0x1c, 0x2a, 0x12, 0x0f, 0x73, 0x0c, 0x15, 0x0b, 0x0c, 0x19, 0x10, + 0x0c, 0x10, 0x0c, 0x21, 0x19, 0x27, 0x00, 0x4a, 0x21, 0x03, 0x08, 0x4a, 0x19, 0x09, 0x00, 0x3f, + 0xed, 0x3f, 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x32, 0x10, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0x5d, 0xc4, 0xd5, 0xc0, 0xfd, 0xc5, 0xc0, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, + 0x01, 0x28, 0x27, 0x37, 0x23, 0x0f, 0x3f, 0x3c, 0x08, 0x14, 0x08, 0x48, 0x48, 0x7b, 0x2d, 0x2d, + 0x14, 0x58, 0x3d, 0x6d, 0x81, 0x27, 0x44, 0x5d, 0x35, 0x22, 0x35, 0x27, 0x19, 0x07, 0x21, 0x14, + 0x39, 0x02, 0x0e, 0x20, 0x39, 0x4f, 0x30, 0x6f, 0x69, 0x02, 0x02, 0x5b, 0x5a, 0x42, 0x42, 0x5a, + 0xae, 0x08, 0x14, 0xa2, 0xa1, 0x4f, 0x79, 0x52, 0x29, 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0e, 0x16, + 0x00, 0x02, 0x00, 0x21, 0xff, 0x58, 0x01, 0xd9, 0x01, 0xe0, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x89, + 0x40, 0x15, 0x29, 0x40, 0x16, 0x00, 0x4d, 0x28, 0x40, 0x16, 0x00, 0x4d, 0x28, 0x40, 0x0b, 0x00, + 0x4d, 0x01, 0x40, 0x09, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x3f, 0x11, 0x12, 0x00, 0x4c, + 0x29, 0x2a, 0x26, 0x14, 0x51, 0x04, 0x03, 0x00, 0x02, 0x01, 0x02, 0x31, 0x20, 0x20, 0x30, 0x20, + 0x02, 0x20, 0x53, 0x0a, 0x1a, 0x30, 0x01, 0x29, 0x7d, 0x28, 0x02, 0x28, 0x50, 0x23, 0x60, 0x23, + 0x02, 0x3f, 0x23, 0x01, 0x23, 0x57, 0x17, 0x28, 0x17, 0x28, 0x17, 0x07, 0x4f, 0x2e, 0x01, 0x2e, + 0x57, 0x1d, 0x0b, 0x0b, 0x40, 0x0e, 0x01, 0x0e, 0x57, 0x07, 0x0f, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, + 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x5d, 0x5d, 0x11, 0x33, 0x10, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, 0xfd, 0xd0, 0xd0, 0xc5, + 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x33, 0x15, 0x23, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x06, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, + 0x23, 0x35, 0x33, 0x35, 0x26, 0x26, 0x23, 0x22, 0x01, 0xa4, 0x35, 0x35, 0x6a, 0x77, 0x2a, 0x4c, + 0x23, 0x17, 0x1a, 0x3d, 0x2c, 0x1e, 0x27, 0x16, 0x09, 0x17, 0x28, 0x17, 0x57, 0x5a, 0x7b, 0x69, + 0x4a, 0x55, 0xfe, 0xfa, 0x25, 0x28, 0x12, 0x1f, 0x0c, 0x47, 0x47, 0x0c, 0x11, 0x0b, 0x62, 0x01, + 0x2c, 0x50, 0xa3, 0x73, 0x6e, 0x12, 0x0c, 0x68, 0x0b, 0x13, 0x0f, 0x1a, 0x23, 0x14, 0x13, 0x0a, + 0x0a, 0x74, 0x67, 0x74, 0x72, 0x19, 0xcd, 0x3a, 0x3d, 0x0a, 0x08, 0x47, 0x50, 0x4b, 0x03, 0x02, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x24, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x29, 0x24, 0x28, + 0x15, 0x20, 0x50, 0x01, 0x1a, 0x29, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, + 0xff, 0x58, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x18, 0x28, 0x2c, 0x21, 0x0c, 0x50, 0x02, 0x24, 0x2d, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf0, 0x40, 0x09, 0x1b, 0x1f, 0x07, 0x1a, 0x50, 0x01, 0x08, 0x20, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x01, 0xe7, 0x03, 0x3d, 0x00, 0x1a, + 0x00, 0x20, 0x00, 0x5c, 0x40, 0x34, 0x05, 0x06, 0x11, 0x10, 0x22, 0x20, 0x1c, 0x21, 0x0b, 0x00, + 0x16, 0x51, 0x18, 0x21, 0x0f, 0x1f, 0x01, 0x1f, 0x86, 0x1b, 0x1e, 0x0f, 0x1d, 0x01, 0x1d, 0x86, + 0x4f, 0x00, 0x01, 0x00, 0x40, 0x13, 0x17, 0x48, 0x00, 0x16, 0x0b, 0x16, 0x0b, 0x00, 0x03, 0x17, + 0x1a, 0x03, 0x19, 0x02, 0x17, 0x06, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2b, 0x5d, 0x3f, 0x5d, 0xdd, 0xc5, 0x3f, 0x5d, + 0x01, 0x10, 0xd6, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xc5, 0xd6, 0xc5, 0x31, 0x30, + 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, + 0x23, 0x11, 0x37, 0x35, 0x27, 0x37, 0x17, 0x37, 0x17, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, + 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, + 0x7c, 0x7c, 0x84, 0x26, 0x5e, 0x5c, 0x26, 0x01, 0x1c, 0x15, 0x2f, 0x32, 0x2f, 0x15, 0x17, 0x36, + 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x02, 0x65, + 0x15, 0x2b, 0x60, 0x38, 0x36, 0x36, 0x38, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd9, + 0x02, 0x79, 0x00, 0x20, 0x00, 0x34, 0x00, 0x39, 0x40, 0x21, 0x2b, 0x46, 0x40, 0x12, 0x60, 0x12, + 0x80, 0x12, 0x90, 0x12, 0x04, 0x12, 0x36, 0x06, 0x1a, 0x00, 0x36, 0x21, 0x46, 0x0c, 0x35, 0x30, + 0x4a, 0x0f, 0x03, 0x26, 0x4a, 0x09, 0x09, 0x1d, 0x00, 0x03, 0x92, 0x00, 0x3f, 0xc5, 0xc5, 0x3f, + 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, + 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x03, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x01, 0x5a, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1b, 0x17, 0x5b, 0x5f, 0x76, 0x69, 0x6d, 0x72, + 0x1f, 0x31, 0x3d, 0x1d, 0x0a, 0x1a, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0xbb, 0x07, 0x15, 0x26, 0x20, + 0x1f, 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x9c, 0x05, 0x09, 0x25, + 0x1b, 0x17, 0x33, 0x15, 0x0e, 0xa1, 0x92, 0xa0, 0xa3, 0xa3, 0xa0, 0x5b, 0x6c, 0x44, 0x2c, 0x19, + 0x08, 0x1e, 0x11, 0x0a, 0x0e, 0x02, 0x05, 0x01, 0x98, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, + 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x02, 0x00, 0x1d, 0xff, 0x56, 0x01, 0xd8, + 0x01, 0xe2, 0x00, 0x26, 0x00, 0x32, 0x00, 0x3f, 0x40, 0x26, 0x2d, 0x53, 0x00, 0x22, 0x20, 0x22, + 0x40, 0x22, 0x60, 0x22, 0x80, 0x22, 0x05, 0x22, 0x34, 0x10, 0x03, 0x0a, 0x34, 0x27, 0x53, 0x80, + 0x18, 0x01, 0x18, 0x33, 0x30, 0x57, 0x1d, 0x0b, 0x2a, 0x57, 0x13, 0x07, 0x09, 0x06, 0x0d, 0x92, + 0x00, 0x3f, 0xd5, 0xc6, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0xdc, + 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x3d, 0x0a, 0x1a, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, + 0x33, 0x1c, 0x30, 0x2a, 0x1b, 0x17, 0x2d, 0x49, 0x34, 0x1c, 0x21, 0x3b, 0x52, 0x30, 0x31, 0x51, + 0x3b, 0x20, 0x1a, 0x2c, 0x37, 0xc1, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x32, 0x30, 0x31, 0x1a, 0x09, + 0x1d, 0x11, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, 0x25, 0x1b, 0x17, 0x33, 0x15, 0x04, 0x27, + 0x41, 0x56, 0x35, 0x37, 0x5b, 0x41, 0x23, 0x23, 0x41, 0x5b, 0x37, 0x38, 0x4b, 0x39, 0x2e, 0xe9, + 0x3f, 0x4e, 0x4e, 0x3f, 0x3f, 0x4d, 0x4d, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd9, + 0x03, 0x12, 0x02, 0x26, 0x02, 0x42, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x35, 0x36, 0x0b, 0x11, 0x50, 0x02, 0x0e, 0x37, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0x56, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, + 0x00, 0x8a, 0x00, 0x00, 0x01, 0x06, 0x02, 0x43, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xff, 0xb4, 0x1b, 0x25, 0x00, 0x01, 0x50, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1a, + 0xff, 0xf3, 0x01, 0xe1, 0x03, 0x3e, 0x02, 0x26, 0x02, 0x0f, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x27, 0x2b, 0x1b, + 0x12, 0x50, 0x01, 0x07, 0x2c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0x5b, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xa3, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0e, 0x26, 0x2a, 0x1b, 0x12, 0x50, 0x01, 0x07, 0x2b, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x31, 0xff, 0x56, 0x01, 0x90, 0x02, 0xb3, 0x02, 0x26, + 0x01, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x1a, + 0x14, 0x18, 0x08, 0x00, 0x50, 0x01, 0x12, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x03, 0x00, 0x12, + 0xff, 0xfa, 0x01, 0xeb, 0x02, 0x72, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x60, 0x40, 0x3b, + 0x21, 0x22, 0x31, 0x16, 0x1f, 0x1a, 0x1f, 0x1a, 0x1f, 0x30, 0x31, 0x00, 0x28, 0x20, 0x28, 0x02, + 0x28, 0xa4, 0x19, 0x20, 0x00, 0x60, 0x00, 0x70, 0x00, 0x03, 0x00, 0x17, 0x31, 0x2f, 0x40, 0x17, + 0x1b, 0x48, 0x2f, 0x40, 0x0d, 0x10, 0x48, 0x2f, 0xa4, 0x09, 0x30, 0x20, 0xa5, 0x21, 0x02, 0x16, + 0xa5, 0x19, 0x08, 0x2f, 0xa5, 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x2b, 0x2b, 0x10, 0xc6, 0xd4, 0x5d, 0xc6, 0xed, + 0x71, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x37, 0x0e, 0x03, + 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, 0x35, 0x17, + 0x19, 0x2d, 0x15, 0x2a, 0x40, 0x2d, 0x17, 0xd0, 0x0c, 0x1e, 0x1e, 0x1e, 0x0c, 0x72, 0xcb, 0x12, + 0x1c, 0x19, 0x19, 0x10, 0x5e, 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, 0x1e, 0x17, + 0x08, 0x04, 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, 0x49, + 0x79, 0x8c, 0x2a, 0x6e, 0x78, 0x7a, 0x36, 0x5d, 0x4c, 0x48, 0x71, 0x66, 0x66, 0x3d, 0x5d, 0xfd, + 0xed, 0x01, 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x12, + 0xff, 0xfa, 0x01, 0xeb, 0x02, 0x72, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x7e, 0x40, 0x1e, + 0x20, 0x1a, 0x30, 0x1a, 0x90, 0x1a, 0x03, 0x1a, 0x17, 0x31, 0x16, 0x1f, 0x16, 0x1f, 0x30, 0x31, + 0x30, 0x20, 0x40, 0x20, 0x90, 0x20, 0x03, 0x21, 0x20, 0x01, 0x20, 0x11, 0x31, 0x28, 0xb8, 0xff, + 0xc0, 0x40, 0x33, 0x17, 0x1b, 0x48, 0x9f, 0x28, 0x01, 0x28, 0xa4, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x60, 0x00, 0x70, 0x00, 0x90, 0x00, 0xa0, 0x00, 0xb0, 0x00, 0x06, 0x00, 0x31, 0x2f, 0x40, 0x0d, + 0x10, 0x48, 0x2f, 0xa4, 0x09, 0x30, 0x1f, 0xa5, 0x22, 0x0a, 0x16, 0xa5, 0x19, 0x06, 0x2f, 0xa5, + 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xed, 0x2b, 0x10, 0xd4, 0x5d, 0x71, 0xed, 0x5d, 0x2b, 0x10, 0xd6, 0xc5, 0x5d, 0x5d, + 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x0e, 0x03, 0x07, 0x33, + 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, 0x35, 0x17, 0x19, 0x2d, + 0x15, 0x2a, 0x40, 0x2d, 0x17, 0xd0, 0x0c, 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, + 0x17, 0x0e, 0x5b, 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, 0x1e, 0x17, 0x08, 0x04, + 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, 0x49, 0x79, 0x0d, + 0x1d, 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, 0x50, 0x48, 0x45, 0x25, 0x5d, 0xfe, 0x82, 0x01, + 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, 0x01, 0x00, 0x00, 0x03, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xeb, + 0x02, 0xb5, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x30, 0x00, 0x6c, 0x40, 0x45, 0x0d, 0x2e, 0xa4, 0x00, + 0x20, 0x19, 0x30, 0x19, 0x02, 0x19, 0x32, 0x15, 0x1e, 0x15, 0x1e, 0x31, 0x17, 0x32, 0x20, 0x20, + 0x30, 0x20, 0x40, 0x20, 0x90, 0x20, 0xe0, 0x20, 0x05, 0x20, 0x10, 0x32, 0x30, 0x27, 0x01, 0x90, + 0x27, 0x01, 0x4f, 0x27, 0x5f, 0x27, 0x6f, 0x27, 0x03, 0x27, 0x85, 0x06, 0x31, 0x1e, 0xa5, 0x21, + 0x0a, 0x15, 0xa5, 0x18, 0x06, 0x0f, 0x10, 0x0e, 0x98, 0x22, 0xa5, 0x0b, 0x0b, 0x2c, 0xa5, 0x03, + 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, + 0x5d, 0x5d, 0x71, 0x10, 0xd6, 0xc5, 0x5d, 0x10, 0xc6, 0x11, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd4, + 0x5d, 0xd6, 0xfd, 0xc0, 0x31, 0x30, 0x25, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x17, 0x35, 0x37, 0x13, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, + 0x23, 0x35, 0x33, 0x05, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x11, 0x26, + 0x01, 0x08, 0x1f, 0x33, 0x1a, 0x4a, 0x49, 0x0e, 0x1c, 0x2b, 0x1d, 0x19, 0x1d, 0x57, 0xe3, 0x0c, + 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, 0x17, 0x0e, 0x5b, 0xb9, 0xfe, 0xa2, 0x0e, + 0x11, 0x09, 0x04, 0x03, 0x0b, 0x17, 0x14, 0x0c, 0x0b, 0x16, 0x0e, 0x0e, 0x0d, 0x86, 0x74, 0x34, + 0x5a, 0x40, 0x25, 0x11, 0xd3, 0x13, 0xfe, 0xcf, 0x1d, 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, + 0x50, 0x48, 0x45, 0x25, 0x5d, 0x53, 0x20, 0x31, 0x3e, 0x1e, 0x1a, 0x30, 0x26, 0x16, 0x05, 0x01, + 0x1b, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x09, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x19, 0x26, 0x24, 0x15, 0x20, 0x50, 0x01, 0x1a, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x1a, 0x2a, 0x28, 0x21, 0x0c, + 0x50, 0x02, 0x24, 0x29, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x1e, 0xff, 0xf3, 0x01, 0xdf, + 0x02, 0x6b, 0x00, 0x21, 0x00, 0x73, 0x40, 0x1b, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x1a, 0x40, 0x15, + 0x1a, 0x48, 0x1a, 0x52, 0xc0, 0x1d, 0xd0, 0x1d, 0xe0, 0x1d, 0x03, 0x1d, 0x23, 0xc0, 0x10, 0xd0, + 0x10, 0x02, 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0b, 0x0e, 0x48, 0x10, 0x52, 0x9f, 0x0d, 0x01, + 0x0d, 0x9f, 0x06, 0x01, 0x06, 0x07, 0x0c, 0x52, 0x90, 0x0a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0x40, + 0x16, 0x15, 0x18, 0x48, 0x0a, 0x22, 0x1b, 0x0a, 0x0f, 0x02, 0x0c, 0x07, 0x0c, 0x07, 0x08, 0x0b, + 0x02, 0x08, 0x08, 0x15, 0xa5, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd0, 0xd6, 0x5d, 0xc0, 0x5d, 0xed, 0x2b, + 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x5d, 0x31, 0x30, 0x05, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, + 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x35, 0x33, 0x15, 0x14, 0x0e, 0x02, 0x01, 0x54, 0x2d, 0x34, 0x1b, 0x07, 0x52, 0x61, 0x61, + 0x52, 0x60, 0x02, 0x08, 0x10, 0x0e, 0x0e, 0x0f, 0x07, 0x01, 0x61, 0x09, 0x1d, 0x37, 0x0d, 0x21, + 0x3e, 0x58, 0x36, 0x31, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0xfe, 0x7d, 0x2d, 0x3c, 0x24, 0x0f, + 0x0f, 0x25, 0x3c, 0x2d, 0xf4, 0xfd, 0x36, 0x58, 0x3e, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, + 0xff, 0x5b, 0x01, 0xdb, 0x02, 0x72, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x3a, 0x40, 0x24, 0x13, 0x53, + 0x00, 0x08, 0x60, 0x08, 0x80, 0x08, 0x90, 0x08, 0xa0, 0x08, 0x05, 0x08, 0x1b, 0x0d, 0x19, 0x44, + 0x20, 0x02, 0x30, 0x02, 0x02, 0x02, 0x1a, 0x0d, 0x48, 0x0e, 0x0e, 0x00, 0x16, 0x4a, 0x05, 0x03, + 0x00, 0x86, 0x00, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, + 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x35, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0xb1, 0x7b, 0x23, + 0x60, 0x39, 0x79, 0x70, 0x2b, 0x4e, 0x6e, 0x43, 0x26, 0x3f, 0x2e, 0x1a, 0x39, 0x32, 0x16, 0x21, + 0x0b, 0xa5, 0x02, 0xf5, 0x0e, 0x14, 0x75, 0x73, 0x4a, 0x79, 0x60, 0x4b, 0x1c, 0x74, 0x15, 0x30, + 0x41, 0x57, 0x3c, 0x37, 0x43, 0x06, 0x03, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xef, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x13, 0x11, 0x05, 0x0e, 0x50, 0x01, 0x06, + 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xdd, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xe7, 0x40, 0x09, 0x17, 0x15, 0x00, 0x07, 0x50, 0x01, 0x02, 0x16, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x00, 0x1c, + 0x00, 0x27, 0x00, 0x33, 0x00, 0x37, 0x00, 0xa3, 0xb9, 0x00, 0x25, 0xff, 0xe0, 0x40, 0x11, 0x0c, + 0x00, 0x4d, 0x20, 0x20, 0x0c, 0x00, 0x4d, 0x40, 0x31, 0x01, 0x2b, 0x40, 0x1a, 0x00, 0x4d, 0x1d, + 0xb8, 0xff, 0xc0, 0x40, 0x4c, 0x0e, 0x00, 0x4d, 0x28, 0x82, 0x7f, 0x15, 0x01, 0x60, 0x15, 0x01, + 0x1f, 0x15, 0x2f, 0x15, 0x3f, 0x15, 0x03, 0x15, 0x39, 0x09, 0x02, 0x03, 0x03, 0x38, 0x22, 0x00, + 0x01, 0x17, 0x03, 0x23, 0x39, 0x22, 0x23, 0x1d, 0x23, 0x1d, 0x22, 0x03, 0x38, 0x1c, 0x39, 0x34, + 0x36, 0x38, 0x2e, 0x82, 0x0b, 0x04, 0x38, 0x2b, 0x80, 0x10, 0x23, 0x48, 0x01, 0x3f, 0x10, 0x01, + 0x10, 0x31, 0x1d, 0x01, 0x01, 0x1d, 0x31, 0x10, 0x04, 0x00, 0x35, 0x37, 0x86, 0x03, 0x08, 0x00, + 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x10, 0xed, + 0x10, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xd6, 0xc5, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x10, 0xd6, 0x5d, 0x5d, + 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x5d, 0x01, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x07, 0x1e, + 0x03, 0x17, 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x07, 0x27, 0x37, 0x01, 0x67, 0x1d, 0xa5, 0x1c, 0x80, 0x18, + 0x2b, 0x28, 0x26, 0x14, 0x0f, 0x0f, 0x19, 0x21, 0x11, 0x12, 0x20, 0x1a, 0x0f, 0x0c, 0x15, 0x26, + 0x27, 0x2a, 0x17, 0xf2, 0x0a, 0x10, 0x0e, 0x0d, 0x08, 0x79, 0x08, 0x0d, 0x0d, 0x10, 0x19, 0x15, + 0x0e, 0x0d, 0x16, 0x16, 0x0d, 0x0e, 0x15, 0x36, 0x98, 0x18, 0x91, 0x85, 0x85, 0x56, 0x93, 0x85, + 0x7e, 0x40, 0x13, 0x21, 0x15, 0x21, 0x17, 0x0b, 0x0b, 0x17, 0x21, 0x15, 0x1b, 0x15, 0x41, 0x80, + 0x88, 0x93, 0x54, 0x01, 0xd5, 0x23, 0x39, 0x36, 0x37, 0x21, 0x21, 0x37, 0x36, 0x39, 0xae, 0x12, + 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0xb0, 0x39, 0x2f, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa6, + 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x09, 0x3c, 0x33, 0x1c, 0x13, 0x50, 0x2b, + 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0xa1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x47, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x52, 0x1b, 0x19, 0x03, 0x11, 0x50, 0x02, 0x08, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0x14, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x03, 0x1a, 0x52, 0x50, 0x25, 0x0a, + 0x50, 0x03, 0x00, 0x51, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xd8, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0xb3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x0a, 0xb6, 0x03, 0x0b, 0x2b, 0x29, 0x00, 0x09, 0x50, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, + 0xff, 0xda, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x8f, 0x00, 0x00, 0x01, 0x06, 0x00, 0xd3, + 0x00, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xf5, 0xb4, 0x11, 0x04, 0x02, 0x00, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x3d, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa5, 0xff, 0xed, 0x00, 0x8b, + 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf0, 0x40, 0x0d, 0x1e, 0x18, 0x04, 0x0b, 0x50, 0x03, + 0x07, 0x1d, 0x4f, 0x02, 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb2, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, + 0xf7, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x36, 0x30, 0x1c, 0x13, 0x50, 0x03, 0x0f, + 0x35, 0x4f, 0x02, 0x0f, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x25, 0x1b, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x1d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x07, 0x3d, 0x33, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x35, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x02, 0xa5, 0xff, 0xed, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xe4, + 0x40, 0x0d, 0x13, 0x0d, 0x00, 0x0a, 0x50, 0x02, 0x01, 0x12, 0x4f, 0x01, 0x01, 0x0e, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb2, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, 0xf7, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, + 0xff, 0xfc, 0x40, 0x0d, 0x2d, 0x27, 0x00, 0x07, 0x50, 0x03, 0x04, 0x2c, 0x4f, 0x02, 0x04, 0x28, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x09, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x1a, 0x10, 0x00, 0x0a, 0x50, 0x01, 0x01, + 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x02, 0x34, 0x2a, 0x00, 0x07, 0x50, 0x02, 0x04, 0x2c, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x02, 0xa5, 0xff, 0xed, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xef, + 0x40, 0x0d, 0x13, 0x0d, 0x00, 0x06, 0x50, 0x02, 0x05, 0x12, 0x4f, 0x01, 0x05, 0x0e, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb2, 0x02, 0x26, + 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, 0xd9, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xda, 0x40, 0x0d, 0x1b, 0x15, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x1a, 0x4f, 0x01, 0x0b, 0x16, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x1a, 0x10, 0x00, 0x06, 0x50, 0x01, 0x05, 0x12, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xa3, 0x02, 0x26, + 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xdc, 0x40, 0x09, 0x22, 0x18, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x02, 0xa5, 0xff, 0xef, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf2, + 0x40, 0x0d, 0x27, 0x21, 0x14, 0x19, 0x50, 0x03, 0x16, 0x26, 0x4f, 0x02, 0x16, 0x22, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb2, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, 0xef, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, + 0xff, 0xf1, 0x40, 0x0d, 0x27, 0x21, 0x09, 0x00, 0x50, 0x03, 0x0e, 0x26, 0x4f, 0x02, 0x0e, 0x22, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x2e, 0x24, 0x14, 0x19, 0x50, 0x02, 0x16, 0x26, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa3, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, + 0x2e, 0x24, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x26, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa5, + 0xff, 0xdd, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xca, 0x40, 0x0d, 0x2c, 0x26, + 0x14, 0x0d, 0x50, 0x03, 0x00, 0x2b, 0x4f, 0x02, 0x00, 0x27, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xcb, 0x02, 0xb2, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa5, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xeb, 0x40, 0x0d, + 0x1b, 0x15, 0x0a, 0x13, 0x50, 0x02, 0x0d, 0x1a, 0x4f, 0x01, 0x0d, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xe9, 0x03, 0x2e, 0x02, 0x26, + 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0xff, 0xef, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x02, 0xff, 0xda, 0x40, 0x09, 0x33, 0x29, 0x14, 0x0d, 0x50, 0x02, 0x00, 0x2b, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0x00, 0x00, 0x01, 0xcb, 0x02, 0xa3, 0x02, 0x26, + 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x1b, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x22, 0x18, 0x0a, 0x13, 0x50, 0x01, 0x0d, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa5, + 0xff, 0xef, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf2, 0x40, 0x0d, 0x21, 0x1b, + 0x04, 0x14, 0x50, 0x02, 0x06, 0x20, 0x4f, 0x01, 0x06, 0x1c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb2, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa5, 0xef, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf3, 0x40, 0x0d, + 0x1a, 0x14, 0x07, 0x00, 0x50, 0x02, 0x09, 0x19, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x2e, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x28, 0x1e, 0x04, 0x14, 0x50, 0x01, 0x06, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x21, 0x17, 0x07, 0x00, + 0x50, 0x01, 0x09, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x22, 0xff, 0x5a, 0x01, 0xd0, + 0x02, 0x79, 0x00, 0x30, 0x00, 0x57, 0xb9, 0x00, 0x23, 0xff, 0xc0, 0x40, 0x2e, 0x0b, 0x0c, 0x00, + 0x4c, 0x22, 0x40, 0x0d, 0x00, 0x4d, 0x0a, 0x22, 0x25, 0x10, 0x63, 0x1f, 0x05, 0x63, 0x40, 0x25, + 0x01, 0x25, 0x32, 0x2d, 0x17, 0x31, 0x0a, 0x65, 0x40, 0x09, 0x01, 0x09, 0x22, 0x09, 0x22, 0x2a, + 0x1a, 0x2e, 0x00, 0x67, 0x2a, 0x12, 0x16, 0x13, 0x67, 0x1a, 0x05, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x5d, 0xed, 0x01, 0x10, 0xc6, 0xc6, + 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x10, 0xd5, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x17, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x77, 0x30, 0x52, 0x3d, 0x22, 0x5a, + 0x4c, 0x3a, 0x2e, 0x20, 0x38, 0x29, 0x18, 0x42, 0x2e, 0x23, 0x45, 0x1b, 0x2a, 0x26, 0x54, 0x34, + 0x31, 0x54, 0x3e, 0x24, 0x2e, 0x2e, 0x3c, 0x39, 0x3b, 0x63, 0x82, 0x48, 0x0b, 0x25, 0x15, 0x09, + 0x11, 0x2f, 0x3b, 0x11, 0x24, 0x37, 0x27, 0x44, 0x39, 0x6b, 0x0b, 0x19, 0x28, 0x1d, 0x31, 0x34, + 0x0f, 0x0e, 0x61, 0x13, 0x14, 0x17, 0x32, 0x4c, 0x36, 0x2e, 0x50, 0x1c, 0x1c, 0x62, 0x38, 0x49, + 0x64, 0x3d, 0x1a, 0x01, 0x03, 0x6b, 0x02, 0x02, 0x00, 0x01, 0x00, 0x4b, 0xff, 0x5a, 0x01, 0xbd, + 0x01, 0xe2, 0x00, 0x26, 0x00, 0x53, 0xb5, 0x09, 0x40, 0x13, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, + 0xb3, 0x0d, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x0d, 0x00, 0x4d, 0x1b, 0x08, 0x1e, + 0x63, 0x05, 0x16, 0x63, 0x0b, 0x28, 0x24, 0x11, 0x27, 0x1b, 0x65, 0x1a, 0x08, 0x08, 0x1a, 0x00, + 0x11, 0x67, 0x10, 0x92, 0x23, 0x21, 0x67, 0x00, 0x0b, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x12, + 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0xed, 0xd4, 0xed, + 0xd5, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x27, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x23, + 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x36, 0xd7, 0x2e, 0x4d, 0x39, + 0x20, 0x29, 0x30, 0x33, 0x38, 0x38, 0x62, 0x84, 0x4c, 0x08, 0x2d, 0x55, 0x44, 0x29, 0x46, 0x33, + 0x17, 0x43, 0x3e, 0x25, 0x26, 0x3f, 0x34, 0x1b, 0x16, 0x45, 0x01, 0xe2, 0x12, 0x27, 0x3c, 0x2a, + 0x23, 0x42, 0x1a, 0x12, 0x4c, 0x33, 0x3c, 0x52, 0x33, 0x17, 0x01, 0x67, 0x02, 0x0b, 0x19, 0x2c, + 0x22, 0x2c, 0x24, 0x63, 0x2b, 0x26, 0x1a, 0x27, 0x15, 0x64, 0x08, 0x11, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xc7, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x0c, 0x10, 0x06, 0x00, 0x50, 0x01, + 0x00, 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x01, 0xb9, + 0x03, 0x3d, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x48, 0x40, 0x2b, 0xa0, 0x0e, 0xb0, 0x0e, 0x02, 0x0e, + 0x51, 0x80, 0x0b, 0x01, 0x0b, 0x1d, 0x1b, 0x17, 0x1c, 0x14, 0x03, 0x51, 0x20, 0x01, 0x30, 0x01, + 0x02, 0x01, 0x1c, 0x1a, 0x86, 0x16, 0x19, 0x18, 0x86, 0x15, 0x06, 0x0d, 0x06, 0x11, 0x57, 0x06, + 0x0b, 0x02, 0x03, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xd5, 0xcd, 0x3f, + 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, + 0x33, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x11, 0x13, 0x27, 0x37, 0x17, 0x37, 0x17, 0x3f, 0x7b, 0x0f, 0x2a, 0x10, + 0x34, 0x46, 0x2a, 0x12, 0x7b, 0x1e, 0x2a, 0x11, 0x21, 0x0a, 0x01, 0x84, 0x26, 0x5e, 0x5c, 0x26, + 0x02, 0x65, 0x15, 0xa8, 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, + 0x03, 0xfe, 0x96, 0x02, 0xa5, 0x60, 0x38, 0x36, 0x36, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x79, 0x00, 0x14, 0x00, 0x2c, 0x40, 0x1a, 0x0b, 0x51, 0x00, 0x08, + 0x10, 0x08, 0x02, 0x08, 0x16, 0x12, 0x51, 0x20, 0x14, 0x30, 0x14, 0x02, 0x14, 0x15, 0x13, 0x08, + 0x09, 0x92, 0x10, 0x57, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, + 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, + 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x11, 0x23, 0x2d, 0x25, 0x69, 0x3e, 0x3d, 0x50, 0x2f, + 0x12, 0x7b, 0x07, 0x14, 0x24, 0x1c, 0x21, 0x28, 0x7b, 0x02, 0x5d, 0x0b, 0x11, 0x23, 0x3c, 0x53, + 0x30, 0xfd, 0xc4, 0x02, 0x37, 0x21, 0x2f, 0x1e, 0x0e, 0x06, 0xfd, 0xf8, 0x00, 0x03, 0x00, 0x11, + 0xff, 0x5b, 0x02, 0x08, 0x02, 0xb6, 0x00, 0x21, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x52, 0x40, 0x2f, + 0x33, 0x39, 0x7c, 0x07, 0x40, 0x1f, 0x2f, 0x52, 0x00, 0x40, 0x30, 0x27, 0x01, 0x27, 0x64, 0x19, + 0x3f, 0x0f, 0x11, 0x3f, 0x21, 0x10, 0x20, 0x98, 0x30, 0x22, 0x01, 0x22, 0x57, 0x1c, 0x0b, 0x3f, + 0x2c, 0x01, 0x2c, 0x57, 0x12, 0x14, 0x09, 0x02, 0x7d, 0x3c, 0x36, 0x7d, 0x10, 0x0c, 0x92, 0x00, + 0x3f, 0xc4, 0xfd, 0xd6, 0xed, 0x3f, 0xc5, 0xed, 0x5d, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xc5, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xd5, 0xfd, 0xc0, 0x10, 0xd5, 0xfd, 0xc6, 0x31, 0x30, + 0x25, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, + 0x37, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x37, 0x03, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x13, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x01, 0x70, 0x16, 0x10, 0x1d, 0x2b, + 0x1c, 0x0e, 0x14, 0x21, 0x2b, 0x16, 0x27, 0x3e, 0x0d, 0x53, 0x3b, 0x64, 0x27, 0x1e, 0x27, 0x3b, + 0x29, 0x15, 0x50, 0x4d, 0x14, 0x2f, 0x16, 0x69, 0xad, 0x12, 0x1b, 0x13, 0x09, 0x07, 0x15, 0x26, + 0x1f, 0x09, 0x16, 0x0d, 0x12, 0x24, 0x9f, 0x17, 0x0e, 0x13, 0x11, 0x11, 0x13, 0x0d, 0x18, 0x76, + 0x05, 0x18, 0x27, 0x32, 0x1a, 0x25, 0x38, 0x25, 0x13, 0x2f, 0x33, 0x59, 0x38, 0x6f, 0x0e, 0x23, + 0x3f, 0x56, 0x33, 0x73, 0x85, 0x0a, 0x0b, 0xd8, 0x13, 0xfe, 0xc5, 0x18, 0x28, 0x33, 0x1b, 0x21, + 0x37, 0x27, 0x15, 0x01, 0x03, 0x01, 0x0b, 0x08, 0x0b, 0xfe, 0x72, 0x23, 0x1c, 0x22, 0x1e, 0x1c, + 0x22, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x2d, + 0x00, 0x41, 0x00, 0x5a, 0xb9, 0x00, 0x20, 0xff, 0xc0, 0x40, 0x35, 0x0f, 0x00, 0x4d, 0x38, 0x53, + 0x60, 0x2b, 0x01, 0x2b, 0x43, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x1a, 0x53, 0x60, 0x23, 0x01, 0x23, + 0x28, 0x43, 0x20, 0x14, 0x30, 0x14, 0x02, 0x14, 0x53, 0x0b, 0x42, 0x2e, 0x53, 0x03, 0x06, 0x42, + 0x1f, 0x02, 0x0f, 0x02, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x17, 0x4a, 0x3d, 0x33, 0x4a, 0x00, 0x09, + 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xc4, 0xd6, 0xed, 0x10, 0xd4, 0xed, + 0x5d, 0x10, 0xc4, 0xd4, 0x5d, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x17, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x27, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0xfa, 0x68, 0x77, 0x3b, 0x2f, 0x16, 0x1a, 0x0e, 0x04, 0x07, + 0x0b, 0x75, 0x05, 0x05, 0x03, 0x01, 0x1d, 0x21, 0x21, 0x1d, 0x01, 0x03, 0x06, 0x04, 0x75, 0x09, + 0x09, 0x04, 0x0e, 0x1a, 0x16, 0x2f, 0x3b, 0x77, 0xca, 0x11, 0x1b, 0x24, 0x12, 0x12, 0x24, 0x1b, + 0x11, 0x11, 0x1b, 0x24, 0x12, 0x12, 0x24, 0x1b, 0x11, 0x0d, 0x63, 0x5d, 0x40, 0x4c, 0x18, 0x0d, + 0x21, 0x25, 0x25, 0x11, 0x29, 0x3d, 0x25, 0x16, 0x21, 0x1e, 0x1c, 0x12, 0x2c, 0x38, 0x38, 0x2c, + 0x12, 0x1c, 0x1e, 0x21, 0x16, 0x25, 0x3d, 0x29, 0x11, 0x25, 0x25, 0x21, 0x0d, 0x18, 0x4c, 0x40, + 0x5d, 0x63, 0xc9, 0x17, 0x23, 0x18, 0x0c, 0x0c, 0x18, 0x23, 0x17, 0x18, 0x23, 0x17, 0x0c, 0x0c, + 0x18, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb5, 0x00, 0x28, + 0x00, 0x34, 0x00, 0x7d, 0xb9, 0x00, 0x1d, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1d, 0xb8, 0xff, + 0xe0, 0x40, 0x4d, 0x0c, 0x00, 0x4d, 0x0d, 0x40, 0x0c, 0x00, 0x4d, 0x0d, 0x20, 0x0b, 0x00, 0x4d, + 0x2c, 0x46, 0x00, 0x10, 0x40, 0x10, 0x60, 0x10, 0x80, 0x10, 0x04, 0x10, 0x36, 0x2f, 0x03, 0x3f, + 0x03, 0x4f, 0x03, 0x03, 0x03, 0x46, 0x40, 0x0a, 0x60, 0x0a, 0x80, 0x0a, 0x03, 0x0a, 0x0d, 0x36, + 0x20, 0x26, 0x30, 0x26, 0x40, 0x26, 0x03, 0x26, 0x46, 0x20, 0x35, 0x32, 0x46, 0x1a, 0x1d, 0x35, + 0x23, 0x10, 0x2f, 0x00, 0x3f, 0x00, 0x02, 0x00, 0x4a, 0x2f, 0x29, 0x4a, 0x15, 0x09, 0x06, 0x10, + 0x00, 0x3f, 0x3f, 0xfd, 0xd6, 0xed, 0x5d, 0x3f, 0x01, 0x10, 0xc4, 0xd6, 0xed, 0x10, 0xd6, 0xed, + 0x5d, 0x10, 0xc4, 0xd6, 0x5d, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x2b, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x37, 0x33, 0x06, 0x06, 0x15, 0x14, 0x16, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0xf9, 0x1f, 0x22, 0x03, 0x06, 0x7d, 0x07, 0x08, 0x23, 0x2e, 0x38, 0x34, + 0x20, 0x3a, 0x52, 0x33, 0x33, 0x52, 0x3a, 0x1f, 0x33, 0x38, 0x2e, 0x22, 0x0f, 0x7d, 0x06, 0x04, + 0x22, 0x1f, 0x2d, 0x33, 0x38, 0x28, 0x28, 0x37, 0x32, 0x01, 0xb5, 0x36, 0x36, 0x1a, 0x50, 0x2a, + 0x23, 0x49, 0x26, 0x39, 0x48, 0x19, 0x1b, 0x68, 0x39, 0x31, 0x51, 0x39, 0x1f, 0x21, 0x3a, 0x50, + 0x2f, 0x39, 0x68, 0x1b, 0x19, 0x48, 0x39, 0x4b, 0x47, 0x2a, 0x50, 0x1a, 0x36, 0x36, 0xfe, 0xa9, + 0x3f, 0x36, 0x39, 0x3f, 0x3f, 0x39, 0x36, 0x3f, 0x00, 0x01, 0x00, 0x2e, 0xff, 0x59, 0x01, 0xc6, + 0x02, 0x6b, 0x00, 0x20, 0x00, 0x5c, 0xb9, 0x00, 0x19, 0xff, 0xe0, 0xb3, 0x15, 0x00, 0x4d, 0x19, + 0xb8, 0xff, 0xe0, 0x40, 0x2f, 0x11, 0x12, 0x00, 0x4c, 0x0f, 0x16, 0x00, 0x07, 0x10, 0x07, 0x02, + 0x07, 0x22, 0x00, 0x1e, 0x10, 0x1e, 0x02, 0x18, 0x1e, 0x05, 0x1d, 0x00, 0x00, 0x1d, 0x05, 0x1e, + 0x18, 0x05, 0x22, 0x17, 0x21, 0x20, 0x02, 0x1e, 0x48, 0x1f, 0x02, 0x05, 0x48, 0x17, 0x08, 0x13, + 0xa5, 0x0f, 0x0c, 0x92, 0x00, 0x3f, 0xc5, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xc6, + 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x10, 0xd6, 0x5d, 0xd5, 0xcc, 0x31, 0x30, + 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x35, 0x35, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, 0xbd, + 0x2b, 0x48, 0x3e, 0x37, 0x19, 0x01, 0x0a, 0x0e, 0x23, 0x3b, 0x2c, 0x0d, 0x2b, 0x16, 0x12, 0x0e, + 0x1a, 0x12, 0x33, 0xfe, 0xcf, 0x16, 0x32, 0x3e, 0x49, 0x2c, 0xee, 0x01, 0x82, 0x02, 0x15, 0x42, + 0x74, 0x69, 0x61, 0x2f, 0x57, 0x2f, 0x44, 0x2d, 0x16, 0x04, 0x08, 0x56, 0x05, 0x02, 0x3a, 0x12, + 0x47, 0x2b, 0x5f, 0x6c, 0x7e, 0x4a, 0x66, 0x00, 0x00, 0x01, 0x00, 0x43, 0xff, 0x5b, 0x01, 0xb4, + 0x01, 0xd6, 0x00, 0x1e, 0x00, 0x4e, 0xb9, 0x00, 0x17, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x17, + 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x0d, 0x00, 0x4d, 0x0c, 0x13, 0x07, 0x20, 0x05, 0x1b, 0x05, 0x1b, + 0x1f, 0x00, 0x20, 0x1c, 0x16, 0x1f, 0x1e, 0x0a, 0x1b, 0x55, 0x1d, 0x0a, 0x15, 0x06, 0x05, 0x55, + 0x14, 0x06, 0x10, 0xa5, 0x0c, 0x09, 0x92, 0x00, 0x3f, 0xc5, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, + 0x3f, 0x01, 0x10, 0xc6, 0xc6, 0x10, 0xc6, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd6, 0xd5, 0xcc, + 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x14, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, + 0xaa, 0x0e, 0x34, 0x3d, 0x3d, 0x18, 0xde, 0x8e, 0x0b, 0x2f, 0x15, 0x11, 0x0d, 0x15, 0x10, 0x17, + 0x1d, 0xfe, 0xf5, 0x17, 0x36, 0x36, 0x34, 0x15, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x10, 0x3f, 0x4e, + 0x55, 0x24, 0x7a, 0x91, 0x04, 0x07, 0x57, 0x05, 0x02, 0x14, 0x18, 0x1e, 0x4b, 0x26, 0x50, 0x4d, + 0x46, 0x1c, 0x66, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2e, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x00, 0x19, 0x1f, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x07, 0x31, 0x37, 0x1c, 0x13, + 0x50, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xcc, + 0x02, 0x6b, 0x00, 0x24, 0x00, 0x69, 0x40, 0x43, 0x1a, 0x40, 0x09, 0x0b, 0x00, 0x4c, 0x4f, 0x1e, + 0x5f, 0x1e, 0x02, 0x1e, 0x00, 0x22, 0x10, 0x22, 0x02, 0x22, 0x3f, 0x1a, 0x01, 0x00, 0x1a, 0x10, + 0x1a, 0x02, 0x1a, 0x26, 0x1b, 0x1c, 0x1f, 0x44, 0x00, 0x17, 0x10, 0x17, 0x02, 0x17, 0x25, 0x03, + 0x10, 0x10, 0x0a, 0x01, 0x0a, 0x25, 0x22, 0x08, 0x1d, 0x48, 0x40, 0x1e, 0x01, 0x1e, 0x1e, 0x17, + 0x1a, 0x48, 0x19, 0x02, 0x20, 0x48, 0x17, 0x08, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xdc, 0xc5, 0x10, 0xd6, + 0x5d, 0xfd, 0xd0, 0xc0, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, 0x5d, 0xc4, 0x5d, 0x31, 0x30, 0x2b, 0x05, + 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, + 0x27, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, + 0x15, 0x23, 0x06, 0x01, 0x2b, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, + 0x10, 0x29, 0x24, 0x14, 0x03, 0x09, 0x05, 0xa6, 0x01, 0x77, 0xfc, 0xdb, 0xdb, 0x01, 0x12, 0x97, + 0x05, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, + 0x06, 0x0b, 0x17, 0x09, 0x02, 0x6b, 0x66, 0x8b, 0x66, 0xae, 0x66, 0x08, 0x00, 0x02, 0x00, 0x1f, + 0xff, 0x56, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x2f, 0x00, 0x3a, 0x00, 0x4f, 0x40, 0x2d, 0x30, 0x53, + 0x20, 0x24, 0x40, 0x24, 0x02, 0x24, 0x2c, 0x3c, 0x25, 0x3a, 0x53, 0x70, 0x19, 0x01, 0x19, 0x3b, + 0x03, 0x10, 0x0a, 0x3b, 0x2f, 0x07, 0x3a, 0x73, 0x25, 0x25, 0x16, 0x35, 0x57, 0x1e, 0x0b, 0x2b, + 0x40, 0x28, 0x01, 0x28, 0x57, 0x16, 0x07, 0x0e, 0x0a, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0xc5, 0x3f, + 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xdc, 0xc5, 0x10, + 0xd6, 0x5d, 0xfd, 0xc0, 0x10, 0xc6, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x05, 0x16, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, + 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x21, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x13, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x07, 0x01, 0x2c, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, + 0x29, 0x24, 0x14, 0x03, 0x07, 0x05, 0x5d, 0x68, 0x26, 0x3e, 0x50, 0x2a, 0x68, 0x6c, 0x01, 0x01, + 0xfe, 0xcf, 0x4c, 0x3c, 0x25, 0x43, 0x17, 0x11, 0x1d, 0x42, 0x26, 0x29, 0x0a, 0x16, 0x22, 0x19, + 0x18, 0x23, 0x17, 0x0d, 0x02, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, + 0x07, 0x19, 0x13, 0x0c, 0x06, 0x0a, 0x14, 0x08, 0x0e, 0x77, 0x67, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, + 0x76, 0x0c, 0x1a, 0x08, 0x2e, 0x35, 0x10, 0x08, 0x69, 0x0b, 0x0d, 0x02, 0x01, 0x23, 0x13, 0x23, + 0x1c, 0x11, 0x10, 0x1c, 0x24, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x3e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x3b, 0x01, 0x24, 0xb9, 0x00, + 0x37, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x37, 0xb8, 0xff, 0xe0, 0x40, 0x1b, 0x16, 0x19, 0x00, + 0x4c, 0x33, 0x20, 0x1b, 0x00, 0x4d, 0x33, 0x20, 0x16, 0x19, 0x00, 0x4c, 0x31, 0x20, 0x1b, 0x00, + 0x4d, 0x31, 0x20, 0x16, 0x19, 0x00, 0x4c, 0x2d, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x2d, + 0xb8, 0xff, 0xe0, 0xb4, 0x16, 0x19, 0x00, 0x4c, 0x2b, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, + 0x2b, 0xb8, 0xff, 0xe0, 0x40, 0x1b, 0x16, 0x19, 0x00, 0x4c, 0x27, 0x20, 0x1b, 0x00, 0x4d, 0x27, + 0x20, 0x16, 0x19, 0x00, 0x4c, 0x25, 0x20, 0x1b, 0x00, 0x4d, 0x25, 0x20, 0x16, 0x19, 0x00, 0x4c, + 0x21, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, + 0x21, 0xb8, 0xff, 0xe8, 0xb3, 0x18, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xe0, 0x40, 0x67, 0x16, 0x17, + 0x00, 0x4c, 0x32, 0xb3, 0x5f, 0x2c, 0x6f, 0x2c, 0x7f, 0x2c, 0xef, 0x2c, 0xff, 0x2c, 0x05, 0x40, + 0x2c, 0x01, 0x2c, 0x3d, 0x0a, 0x46, 0x00, 0x1a, 0x60, 0x1a, 0x80, 0x1a, 0x03, 0x1a, 0x3d, 0x6f, + 0x3a, 0x01, 0x3a, 0x38, 0x3c, 0xf5, 0x20, 0x01, 0x20, 0xb3, 0x50, 0x26, 0x60, 0x26, 0x02, 0x4f, + 0x26, 0x01, 0x26, 0x3c, 0x00, 0x46, 0x14, 0x3c, 0xdf, 0x3a, 0x01, 0x3a, 0x99, 0x39, 0x86, 0x35, + 0xb2, 0xa0, 0x2f, 0x01, 0x9f, 0x2f, 0xbf, 0x2f, 0x02, 0x00, 0x2f, 0x01, 0x2f, 0x02, 0x29, 0xb2, + 0xa0, 0x23, 0x01, 0x9f, 0x23, 0xbf, 0x23, 0x02, 0x00, 0x23, 0x01, 0x23, 0x02, 0x05, 0x4a, 0x1d, + 0x09, 0x0f, 0x4a, 0x17, 0xb4, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0x5d, 0x72, 0xed, 0x3f, + 0x5d, 0x5d, 0x72, 0xed, 0x3f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0x5d, 0xed, + 0x5d, 0x10, 0xd4, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0x5d, 0xed, 0x31, 0x30, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x13, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x13, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x15, 0x23, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, + 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, + 0x74, 0x6a, 0x6d, 0x73, 0xc4, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x01, 0x22, 0x29, 0x48, 0x35, 0x1e, + 0x1f, 0x35, 0x47, 0x29, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x98, 0x97, 0x97, 0x98, + 0x98, 0x97, 0x97, 0x02, 0x1c, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, + 0x1a, 0x1a, 0x1e, 0x1e, 0x7e, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xdc, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x1e, + 0x40, 0x15, 0x04, 0x03, 0x02, 0x00, 0x25, 0x2c, 0x09, 0x00, 0x50, 0x04, 0x0e, 0x3a, 0x4f, 0x03, + 0x0e, 0x2e, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x3b, + 0x00, 0x3f, 0x00, 0xa7, 0xb5, 0x38, 0x60, 0x0d, 0x00, 0x4d, 0x31, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, + 0x00, 0x4d, 0x2e, 0xb8, 0xff, 0xe0, 0x40, 0x26, 0x14, 0x00, 0x4d, 0x2a, 0x20, 0x0f, 0x14, 0x00, + 0x4c, 0x2a, 0x40, 0x0e, 0x00, 0x4d, 0x29, 0x20, 0x14, 0x00, 0x4d, 0x29, 0x40, 0x0f, 0x00, 0x4d, + 0x28, 0x20, 0x15, 0x16, 0x00, 0x4c, 0x0a, 0x46, 0x00, 0x1a, 0x40, 0x1a, 0x02, 0x1a, 0xb8, 0xff, + 0xc0, 0x40, 0x3a, 0x0f, 0x12, 0x48, 0x1a, 0x41, 0x3e, 0x3c, 0x40, 0x20, 0x2e, 0x40, 0x00, 0x46, + 0x14, 0x40, 0x2f, 0x3e, 0x01, 0x3e, 0x40, 0x16, 0x19, 0x48, 0x3e, 0x99, 0x0f, 0x3d, 0x01, 0x3d, + 0x86, 0x38, 0x33, 0x2e, 0x0f, 0x2d, 0x01, 0xbf, 0x2d, 0x01, 0x2d, 0x03, 0x3b, 0x0f, 0x25, 0x01, + 0xbf, 0x25, 0x01, 0x25, 0x03, 0x05, 0x4a, 0x1d, 0x09, 0x0f, 0x4a, 0x17, 0xb4, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x3f, 0x5d, 0x71, 0xc5, 0x3f, 0x5d, 0x71, 0xc5, 0xd5, 0xcc, 0x3f, 0x5d, 0xed, 0x2b, + 0x71, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x27, 0x33, 0x15, + 0x23, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, + 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0x01, 0x6a, 0x05, 0x10, 0x16, + 0x1e, 0x12, 0x0d, 0x18, 0x17, 0x18, 0x0c, 0x10, 0x12, 0x08, 0x31, 0x04, 0x10, 0x18, 0x1e, 0x12, + 0x0d, 0x18, 0x16, 0x17, 0x0d, 0x10, 0x13, 0x08, 0xcf, 0xe8, 0xe8, 0x01, 0x22, 0x29, 0x48, 0x35, + 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x98, 0x97, 0x97, + 0x98, 0x98, 0x97, 0x97, 0x02, 0x3a, 0x0c, 0x1b, 0x17, 0x10, 0x08, 0x0a, 0x08, 0x13, 0x0e, 0x27, + 0x0c, 0x1a, 0x14, 0x0d, 0x08, 0x0b, 0x08, 0x13, 0x0e, 0x5b, 0x47, 0x00, 0xff, 0xff, 0x00, 0x1d, + 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xdc, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xac, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x00, 0x2e, 0x20, 0x09, 0x00, 0x50, 0x03, 0x0e, + 0x3e, 0x4f, 0x02, 0x0e, 0x2d, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x22, 0x28, 0x14, 0x19, 0x50, 0x02, + 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x22, 0x28, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x04, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, + 0x00, 0x2f, 0x00, 0x98, 0xb9, 0x00, 0x2b, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x2b, 0xb8, 0xff, + 0xe0, 0x40, 0x1b, 0x16, 0x19, 0x00, 0x4c, 0x27, 0x20, 0x1b, 0x00, 0x4d, 0x27, 0x20, 0x16, 0x19, + 0x00, 0x4c, 0x25, 0x20, 0x1b, 0x00, 0x4d, 0x25, 0x20, 0x16, 0x19, 0x00, 0x4c, 0x21, 0xb8, 0xff, + 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xe0, 0x40, 0x0a, 0x16, 0x19, 0x00, 0x4c, 0x0a, + 0x46, 0x00, 0x1a, 0x01, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x0d, 0x12, 0x48, 0x1a, 0x31, 0x2e, + 0x2f, 0x30, 0x20, 0xb3, 0x50, 0x26, 0x01, 0x26, 0x30, 0x00, 0x46, 0x14, 0x30, 0xdf, 0x2e, 0x01, + 0x2e, 0x99, 0x2d, 0x86, 0x29, 0xb2, 0xbf, 0x23, 0x01, 0x00, 0x23, 0x01, 0x23, 0x02, 0x05, 0x4a, + 0x1d, 0x09, 0x0f, 0x4a, 0x17, 0xb4, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0x5d, 0xed, 0x3f, + 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x2b, + 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x14, 0x1e, 0x02, + 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x27, 0x33, 0x15, 0x23, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, + 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, + 0x6d, 0x73, 0x01, 0x18, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xad, 0xe8, 0xe8, 0x01, + 0x22, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, + 0x29, 0x98, 0x97, 0x97, 0x98, 0x98, 0x97, 0x97, 0x02, 0x1c, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, + 0x1f, 0x7e, 0x47, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xdc, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, + 0x00, 0x2c, 0x2d, 0x09, 0x00, 0x50, 0x03, 0x0e, 0x2e, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x12, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x15, 0x16, 0x11, 0x06, 0x50, 0x01, 0x05, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x06, 0x23, 0x24, 0x0d, 0x00, + 0x50, 0x01, 0x00, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x02, 0x00, 0x24, 0xff, 0x5b, 0x01, 0xe6, + 0x02, 0xb5, 0x00, 0x17, 0x00, 0x26, 0x00, 0x48, 0xb9, 0x00, 0x20, 0xff, 0xe0, 0x40, 0x27, 0x0d, + 0x10, 0x48, 0x20, 0xa4, 0x60, 0x0e, 0xa0, 0x0e, 0xb0, 0x0e, 0x03, 0x0e, 0x28, 0x26, 0x06, 0x51, + 0x01, 0x03, 0x00, 0x27, 0x09, 0xa5, 0x23, 0x16, 0x17, 0x17, 0x16, 0x23, 0x03, 0x04, 0x1d, 0xa5, + 0x11, 0x92, 0x03, 0x48, 0x04, 0x10, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0xed, 0x01, 0x10, 0xc6, 0xc6, 0xd6, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x31, 0x30, + 0x17, 0x37, 0x11, 0x23, 0x35, 0x33, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x27, 0x07, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x3b, 0x6b, 0x82, 0xfd, 0x14, 0x1e, 0x0d, 0x1b, 0x31, 0x24, 0x16, 0x55, + 0x47, 0x18, 0x29, 0x21, 0x18, 0x08, 0x49, 0xa2, 0x04, 0x0b, 0x13, 0x10, 0x17, 0x1b, 0x1b, 0x17, + 0x08, 0x20, 0x0a, 0x5c, 0x76, 0x02, 0x35, 0x66, 0xfd, 0xc6, 0x09, 0x06, 0x11, 0x24, 0x39, 0x27, + 0x4e, 0x4c, 0x0f, 0x19, 0x1f, 0x10, 0x4e, 0x9a, 0x0e, 0x1a, 0x15, 0x0d, 0x22, 0x1a, 0x1d, 0x21, + 0x0b, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0x5b, 0x02, 0x08, 0x01, 0xe0, 0x00, 0x24, + 0x00, 0x30, 0x00, 0x90, 0xb9, 0x00, 0x30, 0xff, 0xe0, 0xb3, 0x12, 0x00, 0x4d, 0x2e, 0xb8, 0xff, + 0xc0, 0xb4, 0x10, 0x12, 0x00, 0x4c, 0x12, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x10, 0xb8, + 0xff, 0xf0, 0x40, 0x09, 0x13, 0x14, 0x00, 0x4c, 0x20, 0x30, 0x01, 0x30, 0x13, 0xb8, 0xff, 0xc0, + 0x40, 0x3a, 0x0b, 0x0e, 0x48, 0x13, 0x79, 0x00, 0x24, 0x10, 0x24, 0x80, 0x24, 0x90, 0x24, 0x04, + 0x24, 0x32, 0x80, 0x2b, 0x90, 0x2b, 0x02, 0x2b, 0x7c, 0x07, 0x32, 0x4f, 0x1a, 0x01, 0x1a, 0x79, + 0x1b, 0x11, 0x31, 0x02, 0x7d, 0x2e, 0x10, 0x11, 0x0f, 0x12, 0x2e, 0x2e, 0x12, 0x0f, 0x11, 0x10, + 0x05, 0x0c, 0x16, 0x55, 0x1f, 0x0b, 0x1a, 0x06, 0x28, 0x7d, 0x0c, 0x92, 0x00, 0x3f, 0xed, 0x3f, + 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x10, 0xed, 0x01, 0x10, 0xc6, 0xd6, + 0xed, 0x5d, 0x10, 0xd5, 0xed, 0x5d, 0x10, 0xd4, 0x5d, 0xed, 0x2b, 0xc0, 0x5d, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x07, 0x27, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x07, 0x01, 0x70, 0x16, 0x10, 0x1d, 0x2b, 0x1c, 0x0e, 0x14, 0x21, 0x2b, 0x16, 0x27, 0x3e, + 0x0d, 0x53, 0x3b, 0x75, 0x24, 0x23, 0x0a, 0x27, 0x0b, 0x69, 0x1f, 0x59, 0x35, 0x33, 0x42, 0x25, + 0x0e, 0x17, 0x0e, 0x13, 0x11, 0x11, 0x13, 0x0d, 0x18, 0x76, 0x05, 0x18, 0x27, 0x32, 0x1a, 0x25, + 0x38, 0x25, 0x13, 0x30, 0x33, 0x5a, 0x38, 0x81, 0xe4, 0x42, 0x38, 0x05, 0x03, 0xfe, 0x8d, 0x01, + 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xe4, 0x23, 0x1c, 0x22, 0x1e, 0x1c, 0x22, 0x0d, + 0x00, 0x02, 0x00, 0x24, 0xff, 0x5b, 0x01, 0xcf, 0x02, 0x60, 0x00, 0x1b, 0x00, 0x2a, 0x00, 0x90, + 0x40, 0x60, 0x2f, 0x24, 0xcf, 0x24, 0xdf, 0x24, 0xff, 0x24, 0x04, 0x24, 0x51, 0x5f, 0x08, 0x01, + 0x00, 0x08, 0x10, 0x08, 0x20, 0x08, 0x40, 0x08, 0x04, 0x08, 0x5f, 0x1a, 0x01, 0x00, 0x1a, 0x10, + 0x1a, 0x20, 0x1a, 0x40, 0x1a, 0x04, 0x1a, 0x2c, 0x2a, 0x18, 0x1b, 0x51, 0x15, 0x12, 0x50, 0x13, + 0x60, 0x13, 0x70, 0x13, 0x03, 0x13, 0x50, 0x10, 0x60, 0x10, 0x70, 0x10, 0x03, 0x10, 0x2b, 0x1a, + 0x13, 0x12, 0x1b, 0x72, 0x18, 0x18, 0x19, 0x06, 0x03, 0xa5, 0x27, 0x16, 0x27, 0x11, 0x0e, 0x10, + 0x0f, 0x0f, 0x10, 0x0e, 0x11, 0x27, 0x16, 0x06, 0x0b, 0x17, 0x02, 0x15, 0x14, 0x06, 0x21, 0xa5, + 0x0b, 0x92, 0x00, 0x3f, 0xed, 0x3f, 0x33, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x10, 0xed, 0x3f, 0x33, 0x2f, 0xed, 0x32, 0x32, 0x32, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x5d, + 0xd5, 0xc0, 0xfd, 0xc0, 0xc0, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, 0x5d, 0x5d, 0xed, 0x5d, 0x31, 0x30, + 0x25, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, + 0x37, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, 0x0a, 0x11, 0x1a, 0x0c, 0x1b, 0x33, + 0x28, 0x18, 0x55, 0x47, 0x30, 0x48, 0x10, 0x43, 0x44, 0x6b, 0x6b, 0x6b, 0x7b, 0xc5, 0xc5, 0x04, + 0x0b, 0x13, 0x10, 0x17, 0x1b, 0x1b, 0x17, 0x08, 0x20, 0x0a, 0x7b, 0x08, 0x07, 0x11, 0x24, 0x39, + 0x27, 0x4e, 0x4c, 0x30, 0x21, 0x48, 0x40, 0x76, 0x01, 0x56, 0x66, 0x76, 0x14, 0x8a, 0x66, 0xfe, + 0x8e, 0x0e, 0x1a, 0x15, 0x0d, 0x22, 0x1a, 0x1d, 0x21, 0x0b, 0x08, 0x00, 0x00, 0x03, 0x00, 0x18, + 0xff, 0xf3, 0x01, 0xdb, 0x02, 0xb5, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x3b, 0x00, 0x5b, 0x40, 0x3b, + 0x40, 0x24, 0x50, 0x24, 0x02, 0x24, 0x84, 0x80, 0x19, 0x90, 0x19, 0xa0, 0x19, 0x03, 0x19, 0x3d, + 0x2b, 0x2f, 0x12, 0x3f, 0x12, 0x02, 0x12, 0x79, 0x3a, 0x90, 0x10, 0x01, 0x10, 0x3c, 0x4f, 0x34, + 0x5f, 0x34, 0x02, 0x34, 0x84, 0x08, 0x3c, 0x21, 0xa5, 0x1e, 0x07, 0x29, 0xa5, 0x14, 0x0b, 0x11, + 0x00, 0x10, 0x00, 0x2f, 0xa5, 0x0d, 0x0b, 0x36, 0xa5, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xd4, 0x5d, 0x32, 0xed, + 0x5d, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x37, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x35, 0x37, 0x15, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x37, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, + 0x11, 0x16, 0x16, 0x03, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0xfa, + 0x13, 0x26, 0x14, 0x26, 0x38, 0x25, 0x12, 0x10, 0x20, 0x2e, 0x1d, 0x19, 0x1d, 0x60, 0x1d, 0x1b, + 0x1d, 0x2e, 0x1f, 0x10, 0x12, 0x24, 0x38, 0x27, 0x12, 0x28, 0x39, 0x1a, 0x1a, 0x05, 0x0b, 0x11, + 0x0c, 0x0f, 0x14, 0x05, 0x0e, 0x97, 0x0b, 0x0f, 0x0b, 0x05, 0x33, 0x08, 0x0e, 0x05, 0x14, 0x0a, + 0x0b, 0x0c, 0x26, 0x43, 0x5c, 0x35, 0x34, 0x5a, 0x40, 0x25, 0x11, 0xd1, 0x15, 0xe6, 0x11, 0x24, + 0x41, 0x59, 0x34, 0x35, 0x5c, 0x44, 0x26, 0x0c, 0x55, 0x52, 0x50, 0x1b, 0x32, 0x27, 0x17, 0x13, + 0xfe, 0xea, 0x02, 0x02, 0x01, 0x2d, 0x17, 0x26, 0x32, 0x1a, 0xa4, 0x02, 0x02, 0x01, 0x16, 0x13, + 0x00, 0x03, 0x00, 0x18, 0xff, 0x5b, 0x01, 0xdb, 0x01, 0xe2, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x3a, + 0x00, 0x5a, 0x40, 0x3b, 0x40, 0x34, 0x50, 0x34, 0x02, 0x34, 0x84, 0x20, 0x08, 0x80, 0x08, 0x90, + 0x08, 0xa0, 0x08, 0x04, 0x08, 0x3c, 0x4f, 0x25, 0x5f, 0x25, 0x02, 0x25, 0x84, 0x1a, 0x3b, 0x39, + 0x3f, 0x10, 0x01, 0x10, 0x79, 0x2c, 0x90, 0x13, 0xa0, 0x13, 0x02, 0x13, 0x3b, 0x22, 0xa5, 0x1f, + 0x0b, 0x2a, 0xa5, 0x15, 0x07, 0x11, 0x0e, 0x2f, 0xa5, 0x0d, 0x07, 0x36, 0xa5, 0x03, 0x0b, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd4, 0x5d, 0x32, 0xed, 0x5d, + 0x32, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x1e, + 0x02, 0x33, 0x32, 0x37, 0x11, 0x26, 0x13, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x23, 0x22, 0x07, 0x11, + 0x16, 0xf9, 0x13, 0x26, 0x14, 0x27, 0x38, 0x24, 0x12, 0x11, 0x1f, 0x2e, 0x1d, 0x0d, 0x1b, 0x0e, + 0x60, 0x1e, 0x1a, 0x1d, 0x2e, 0x1f, 0x10, 0x12, 0x25, 0x38, 0x26, 0x12, 0x28, 0x39, 0x1a, 0x1a, + 0x06, 0x0b, 0x11, 0x0b, 0x0f, 0x14, 0x0a, 0x8e, 0x0b, 0x10, 0x0a, 0x05, 0x33, 0x0f, 0x0c, 0x16, + 0x01, 0xcc, 0x0a, 0x0c, 0x26, 0x43, 0x5b, 0x35, 0x35, 0x59, 0x40, 0x25, 0x08, 0x07, 0xaa, 0xab, + 0x10, 0x24, 0x41, 0x58, 0x34, 0x36, 0x5b, 0x44, 0x26, 0x0c, 0x54, 0x52, 0x50, 0x1b, 0x32, 0x27, + 0x17, 0x13, 0x01, 0x15, 0x05, 0xfe, 0xd3, 0x17, 0x26, 0x31, 0x1a, 0xa5, 0x05, 0xfe, 0xeb, 0x13, + 0x00, 0x03, 0x00, 0x09, 0xff, 0xa9, 0x01, 0xeb, 0x02, 0xbf, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x1f, + 0x00, 0x46, 0x40, 0x2d, 0x09, 0x0e, 0x0a, 0x0f, 0x08, 0x1b, 0x07, 0x1e, 0x1f, 0x18, 0x10, 0x13, + 0x17, 0x11, 0x00, 0x16, 0x06, 0x01, 0x12, 0x02, 0x14, 0x20, 0x0d, 0x21, 0x03, 0x20, 0x17, 0x1f, + 0x48, 0x00, 0x13, 0x18, 0x1e, 0x03, 0x10, 0x10, 0x07, 0x0e, 0x08, 0x07, 0x02, 0x06, 0x02, 0x02, + 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x17, 0x39, 0x33, 0xed, 0x32, 0x01, 0x10, + 0xc6, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x31, 0x30, 0x37, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, + 0x37, 0x17, 0x07, 0x16, 0x12, 0x17, 0x23, 0x27, 0x23, 0x07, 0x27, 0x13, 0x06, 0x06, 0x07, 0x33, + 0x37, 0x26, 0x26, 0x17, 0x26, 0x26, 0x27, 0x07, 0xc9, 0x24, 0x1c, 0x80, 0x2c, 0x5a, 0x2a, 0x7b, + 0x14, 0x38, 0x26, 0x26, 0x49, 0x22, 0x7d, 0x1e, 0x4e, 0x34, 0x36, 0x64, 0x14, 0x20, 0x0c, 0x24, + 0x2e, 0x05, 0x08, 0x3c, 0x04, 0x08, 0x05, 0x13, 0x8f, 0x8f, 0xb7, 0x01, 0x2d, 0x87, 0x54, 0x09, + 0xa4, 0x76, 0xfe, 0xf9, 0x95, 0x8f, 0xe6, 0x0a, 0x02, 0x4e, 0x47, 0x82, 0x43, 0xcb, 0x11, 0x1f, + 0xfb, 0x14, 0x2a, 0x15, 0x53, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xa8, 0x01, 0xf0, + 0x02, 0xc1, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x6b, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb3, 0x0b, 0x00, + 0x4d, 0x04, 0xb8, 0xff, 0xd8, 0x40, 0x38, 0x0b, 0x00, 0x4d, 0x14, 0x1b, 0x11, 0x29, 0x1c, 0x03, + 0x28, 0x06, 0x08, 0x30, 0x40, 0x22, 0x01, 0x22, 0x40, 0x17, 0x01, 0x17, 0x30, 0x13, 0x01, 0x13, + 0x31, 0x25, 0x46, 0x09, 0x05, 0x30, 0x1c, 0x28, 0x1b, 0x14, 0x04, 0x12, 0x06, 0x03, 0x06, 0x03, + 0x04, 0x12, 0x10, 0x18, 0x2b, 0x4a, 0x0e, 0x03, 0x04, 0x87, 0x21, 0x1e, 0x4a, 0x00, 0x09, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xfd, 0xc0, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x17, 0x39, + 0x01, 0x10, 0xc2, 0xd6, 0xed, 0x10, 0xc0, 0x5d, 0xc6, 0x5d, 0xc6, 0x5d, 0x12, 0x17, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x05, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x03, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x03, 0x14, 0x16, 0x17, 0x13, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x01, 0x28, 0x11, 0x1f, 0x0f, 0x1b, 0x4f, 0x1c, 0x3f, 0x41, 0x2a, 0x4b, 0x67, 0x3d, 0x0c, + 0x18, 0x0b, 0x19, 0x51, 0x18, 0x16, 0x1f, 0x06, 0x24, 0x0e, 0x1c, 0x0e, 0x88, 0x12, 0x16, 0x30, + 0x3f, 0x13, 0x1f, 0x1a, 0x59, 0xca, 0x14, 0x17, 0x7e, 0x05, 0x0a, 0x1d, 0x37, 0x2b, 0x1b, 0x0d, + 0x02, 0x04, 0x51, 0x17, 0x56, 0x26, 0x91, 0x6a, 0x4d, 0x78, 0x53, 0x2b, 0x02, 0x01, 0x4b, 0x17, + 0x4a, 0x08, 0x0f, 0x05, 0x62, 0x09, 0x0e, 0x05, 0xfe, 0x63, 0x03, 0x16, 0x0b, 0x61, 0x10, 0x1b, + 0x01, 0x46, 0x39, 0x56, 0x1c, 0x01, 0x7f, 0x01, 0x15, 0x31, 0x52, 0x00, 0x00, 0x02, 0x00, 0x27, + 0xff, 0xb1, 0x01, 0xd7, 0x02, 0x23, 0x00, 0x25, 0x00, 0x2e, 0x00, 0x5e, 0x40, 0x3a, 0x20, 0x10, + 0x0c, 0x00, 0x4d, 0x1f, 0x29, 0x23, 0x03, 0x2f, 0x08, 0x09, 0x10, 0x07, 0x06, 0x2a, 0x06, 0x30, + 0x12, 0x12, 0x2f, 0x20, 0x19, 0x60, 0x19, 0x70, 0x19, 0x03, 0x19, 0x5f, 0x0c, 0x01, 0x20, 0x0c, + 0x01, 0x0c, 0x30, 0x26, 0x53, 0x00, 0x22, 0x2f, 0x21, 0xb6, 0x18, 0x15, 0x57, 0x1c, 0x07, 0x07, + 0xac, 0x2a, 0x0d, 0x10, 0x57, 0x09, 0x05, 0x0b, 0x00, 0x3f, 0xc5, 0xfd, 0xc6, 0xc5, 0x3f, 0x3f, + 0xfd, 0xc6, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xc6, 0x5d, 0x5d, 0xc6, 0x5d, 0x12, 0x39, + 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x33, + 0x37, 0x17, 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x07, 0x03, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x07, 0x07, 0x27, 0x37, 0x26, 0x26, 0x37, + 0x14, 0x16, 0x17, 0x37, 0x0e, 0x03, 0x27, 0x20, 0x44, 0x68, 0x47, 0x0c, 0x15, 0x48, 0x13, 0x10, + 0x1e, 0x11, 0x1b, 0x0e, 0x21, 0x15, 0x04, 0x55, 0x0b, 0x1a, 0x0e, 0x1f, 0x44, 0x1a, 0x10, 0x1a, + 0x4d, 0x33, 0x14, 0x23, 0x11, 0x01, 0x17, 0x46, 0x17, 0x47, 0x40, 0x7d, 0x16, 0x19, 0x4f, 0x23, + 0x30, 0x1e, 0x0d, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x41, 0x14, 0x38, 0x05, 0x0a, 0x06, 0x63, 0x05, + 0x0b, 0x04, 0x0a, 0xfe, 0xfb, 0x02, 0x02, 0x09, 0x08, 0x65, 0x0a, 0x0d, 0x04, 0x03, 0x03, 0x48, + 0x14, 0x49, 0x1e, 0x74, 0x4b, 0x23, 0x37, 0x12, 0xf6, 0x04, 0x17, 0x24, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x0d, 0x00, 0x35, 0x40, 0x1c, + 0x20, 0x00, 0x01, 0x00, 0x0c, 0x0b, 0x09, 0x08, 0x51, 0x02, 0x05, 0x04, 0x0e, 0x07, 0x02, 0x06, + 0x02, 0x05, 0x08, 0x55, 0x02, 0x0b, 0x0c, 0x55, 0x01, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0xfd, + 0xd6, 0xc0, 0xfd, 0xc0, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc5, 0xd0, 0xd0, 0xc5, + 0x5d, 0x31, 0x30, 0x21, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x33, 0x01, 0xcc, 0xfe, 0x96, 0x50, 0x50, 0x7b, 0x83, 0x83, 0xef, 0x01, 0x1a, 0x62, 0xef, 0xef, + 0x62, 0xb4, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0xff, 0xc1, 0x02, 0x0b, 0x02, 0xbb, 0x00, 0x0c, + 0x00, 0x0f, 0x00, 0x43, 0x40, 0x25, 0x0e, 0x40, 0x15, 0x00, 0x4d, 0x07, 0x10, 0x01, 0x00, 0x0e, + 0x03, 0x11, 0x0d, 0x0d, 0x10, 0x11, 0x03, 0x0f, 0x51, 0x09, 0x06, 0x0a, 0x0c, 0x10, 0x0c, 0x02, + 0x07, 0xb6, 0x05, 0x08, 0x01, 0x00, 0x0a, 0x0f, 0x48, 0x00, 0x02, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xc0, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x12, + 0x17, 0x39, 0x12, 0x39, 0x31, 0x30, 0x2b, 0x01, 0x37, 0x17, 0x03, 0x11, 0x23, 0x35, 0x07, 0x27, + 0x37, 0x11, 0x23, 0x35, 0x17, 0x37, 0x23, 0x01, 0x94, 0x33, 0x44, 0xf3, 0x7b, 0x5e, 0x43, 0xa1, + 0x84, 0xff, 0x3a, 0x3a, 0x02, 0x6b, 0x50, 0x2d, 0xfe, 0x84, 0xfe, 0xee, 0x52, 0x91, 0x2d, 0xfc, + 0x01, 0x1b, 0x66, 0xc1, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0x5b, 0x01, 0xba, + 0x01, 0xe2, 0x00, 0x44, 0x00, 0x4e, 0x40, 0x2d, 0x3d, 0x40, 0x0e, 0x00, 0x4d, 0x2c, 0x35, 0x46, + 0x15, 0x03, 0x53, 0x26, 0x46, 0x1c, 0x53, 0x0d, 0x50, 0x3f, 0x01, 0x3f, 0x45, 0x3f, 0x06, 0x34, + 0x31, 0x38, 0x92, 0x21, 0x08, 0x12, 0x40, 0x00, 0x01, 0x00, 0x57, 0x2b, 0x07, 0x16, 0x4f, 0x19, + 0x01, 0x19, 0x57, 0x12, 0x0b, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x39, + 0x3f, 0xd5, 0xc6, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, + 0xcc, 0x31, 0x30, 0x2b, 0x37, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, + 0x17, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x23, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x37, 0x17, + 0x06, 0x06, 0x23, 0x22, 0x2e, 0x04, 0x27, 0x37, 0x1e, 0x03, 0xe4, 0x2d, 0x30, 0x0f, 0x1b, 0x23, + 0x13, 0x1b, 0x38, 0x2e, 0x1e, 0x17, 0x31, 0x4c, 0x35, 0x2e, 0x4f, 0x1d, 0x13, 0x11, 0x48, 0x2d, + 0x2f, 0x21, 0x0f, 0x19, 0x21, 0x13, 0x1b, 0x3a, 0x2f, 0x1e, 0x16, 0x33, 0x52, 0x3c, 0x15, 0x19, + 0x26, 0x1e, 0x19, 0x0e, 0x0d, 0x20, 0x15, 0x0b, 0x19, 0x37, 0x0d, 0x23, 0x37, 0x2d, 0x27, 0x28, + 0x2c, 0x1c, 0x23, 0x11, 0x2a, 0x2b, 0x28, 0x5d, 0x0d, 0x14, 0x0d, 0x12, 0x0d, 0x0c, 0x06, 0x08, + 0x15, 0x20, 0x31, 0x25, 0x1e, 0x35, 0x29, 0x17, 0x0e, 0x0d, 0x68, 0x05, 0x17, 0x17, 0x0d, 0x0b, + 0x11, 0x0e, 0x0d, 0x06, 0x09, 0x16, 0x21, 0x33, 0x25, 0x1d, 0x30, 0x22, 0x13, 0x15, 0x1a, 0x0f, + 0x05, 0x03, 0x02, 0x5c, 0x07, 0x04, 0x15, 0x21, 0x2a, 0x2a, 0x28, 0x0e, 0x5c, 0x07, 0x0a, 0x06, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0xff, 0x5b, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x21, + 0x00, 0x3d, 0x40, 0x22, 0x05, 0x40, 0x0c, 0x00, 0x4d, 0x19, 0x1f, 0x05, 0x1e, 0x00, 0x00, 0x1e, + 0x05, 0x1f, 0x19, 0x05, 0x22, 0x21, 0x0d, 0x23, 0x20, 0x22, 0x1e, 0x55, 0x21, 0x0a, 0x19, 0x18, + 0x06, 0x0d, 0x0a, 0x4a, 0x10, 0x0e, 0x00, 0x3f, 0xed, 0xc5, 0x3f, 0xc5, 0x3f, 0xed, 0x01, 0x10, + 0xc6, 0x10, 0xc6, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x31, 0x30, 0x2b, 0x01, + 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x33, 0x32, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x04, 0x23, + 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, 0xaa, 0x0e, 0x38, 0x43, 0x44, 0x19, 0x21, + 0x34, 0x2f, 0x2f, 0x1c, 0x1e, 0x1d, 0x0b, 0x16, 0x31, 0x0b, 0x21, 0x34, 0x2d, 0x2a, 0x2f, 0x39, + 0x24, 0x0c, 0x17, 0x36, 0x36, 0x34, 0x15, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x0f, 0x45, 0x57, 0x60, + 0x28, 0x0c, 0x2d, 0x2b, 0x21, 0x06, 0x64, 0x07, 0x04, 0x18, 0x25, 0x2b, 0x25, 0x18, 0x4b, 0x26, + 0x50, 0x4d, 0x46, 0x1c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x78, 0x00, 0x23, 0x00, 0x21, 0x40, 0x10, 0x0a, 0x46, 0x1b, 0x25, 0x00, 0x51, 0x01, 0x13, + 0x24, 0x12, 0x0d, 0x67, 0x16, 0x03, 0x00, 0x06, 0x00, 0x3f, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xc6, + 0xd6, 0xed, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x21, 0x23, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x03, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x0e, 0x03, 0x15, 0x01, 0x11, 0x7c, 0x34, 0x23, 0x19, 0x26, 0x18, 0x0c, 0x37, 0x26, + 0x14, 0x2a, 0x27, 0x22, 0x0c, 0x28, 0x2c, 0x62, 0x30, 0x35, 0x50, 0x36, 0x1c, 0x29, 0x2c, 0x14, + 0x24, 0x1d, 0x11, 0xc4, 0x3a, 0x47, 0x15, 0x0f, 0x19, 0x18, 0x19, 0x11, 0x29, 0x1e, 0x06, 0x0b, + 0x0c, 0x06, 0x62, 0x17, 0x17, 0x1d, 0x30, 0x3e, 0x22, 0x2c, 0x53, 0x1a, 0x0c, 0x1a, 0x20, 0x27, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xbf, 0x01, 0xe2, 0x00, 0x25, + 0x00, 0x25, 0x40, 0x13, 0x0c, 0x53, 0x00, 0x1b, 0x01, 0x1b, 0x27, 0x00, 0x6e, 0x01, 0x13, 0x26, + 0x12, 0x0f, 0x57, 0x18, 0x0b, 0x00, 0x06, 0x00, 0x3f, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xc6, 0xd6, + 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x21, 0x23, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x03, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x07, 0x0e, 0x03, 0x15, 0x01, 0x11, 0x7c, 0x0e, 0x18, 0x1f, 0x12, 0x0f, 0x1f, 0x18, 0x10, + 0x25, 0x2a, 0x23, 0x4d, 0x20, 0x27, 0x0a, 0x27, 0x32, 0x38, 0x1d, 0x63, 0x68, 0x0c, 0x14, 0x1a, + 0x0e, 0x14, 0x24, 0x1d, 0x11, 0x71, 0x1a, 0x29, 0x21, 0x1a, 0x0b, 0x0a, 0x10, 0x11, 0x14, 0x0e, + 0x17, 0x18, 0x15, 0x11, 0x62, 0x05, 0x11, 0x0f, 0x0b, 0x4a, 0x44, 0x1a, 0x27, 0x1d, 0x16, 0x09, + 0x0c, 0x16, 0x1a, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd5, + 0x02, 0x72, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x76, 0xb9, 0x00, 0x0c, 0xff, 0xd8, 0xb3, + 0x0a, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xd0, 0x40, 0x3e, 0x09, 0x00, 0x4d, 0x0b, 0x40, 0x09, 0x00, + 0x4d, 0x2f, 0x46, 0x15, 0x28, 0x46, 0x60, 0x00, 0x01, 0x00, 0x3a, 0x38, 0x44, 0x0d, 0x0a, 0x1c, + 0x1f, 0x44, 0x09, 0x0c, 0x0a, 0x39, 0x40, 0x2c, 0x01, 0x2c, 0x48, 0xd0, 0x1e, 0x01, 0xd0, 0x09, + 0x01, 0x2b, 0x1d, 0x0c, 0x1e, 0x09, 0x18, 0x09, 0x1e, 0x0c, 0x1d, 0x2b, 0x18, 0x06, 0x05, 0x34, + 0x4a, 0x10, 0x03, 0x23, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xd5, 0x32, + 0xfd, 0xc0, 0x10, 0xd4, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x23, 0x35, 0x33, 0x11, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x25, 0x15, 0x33, 0x15, 0x23, 0x15, 0x16, + 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x01, 0xd5, 0x23, 0x3e, 0x52, 0x30, 0x26, 0x53, 0x29, 0x3e, 0x3e, + 0x21, 0x4f, 0x26, 0x41, 0x52, 0x2e, 0x11, 0x2b, 0x24, 0x3f, 0x2d, 0xfe, 0xf7, 0x42, 0x42, 0x0b, + 0x19, 0x0c, 0x12, 0x22, 0x1b, 0x11, 0x30, 0x29, 0x12, 0x26, 0x29, 0x0c, 0x13, 0x1a, 0x0e, 0x0b, + 0x18, 0x0a, 0xbb, 0x38, 0x4b, 0x2d, 0x13, 0x09, 0x09, 0x8d, 0x4f, 0x01, 0x7d, 0x06, 0x09, 0x1d, + 0x2f, 0x3a, 0x1d, 0x2c, 0x44, 0x14, 0x17, 0x4e, 0x29, 0x29, 0x4f, 0x30, 0x02, 0x02, 0x07, 0x13, + 0x23, 0x1b, 0x2d, 0x27, 0x66, 0x29, 0x24, 0x16, 0x1b, 0x0f, 0x05, 0x02, 0x02, 0x8e, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf3, 0x01, 0xe2, 0x02, 0x6b, 0x00, 0x18, 0x00, 0x21, 0x00, 0xa3, + 0xb9, 0x00, 0x16, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0a, + 0x00, 0x4c, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x1e, 0x09, 0x0a, 0x00, 0x4c, 0x0a, 0x40, 0x0b, 0x00, + 0x4d, 0x09, 0x40, 0x0b, 0x00, 0x4d, 0x06, 0x40, 0x0b, 0x00, 0x4d, 0x05, 0x40, 0x0b, 0x00, 0x4d, + 0x04, 0x40, 0x0b, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xe0, 0x40, 0x3d, 0x09, 0x0a, 0x00, 0x4c, 0x1d, + 0x0d, 0x44, 0x00, 0x0f, 0x10, 0x0f, 0x02, 0x0f, 0x13, 0x20, 0x11, 0x01, 0x01, 0x11, 0x11, 0x11, + 0x02, 0x11, 0x23, 0x1e, 0x30, 0x0c, 0x01, 0x0c, 0x44, 0x0f, 0x0a, 0x1f, 0x0a, 0x02, 0x0a, 0x0f, + 0x06, 0x1f, 0x06, 0x02, 0x06, 0x08, 0x22, 0x10, 0x09, 0x0d, 0x72, 0x13, 0x06, 0x1d, 0x1d, 0x00, + 0x0e, 0x02, 0x0b, 0x02, 0x19, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, + 0x33, 0x33, 0xed, 0x32, 0x32, 0x01, 0x10, 0xd6, 0xc5, 0x5d, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0x10, + 0xd6, 0x71, 0x71, 0xc5, 0xd6, 0x5d, 0xed, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, + 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x32, 0x36, 0x35, 0x35, 0x23, + 0x15, 0x14, 0x16, 0xf6, 0x36, 0x47, 0x2a, 0x12, 0x2b, 0x2b, 0x7b, 0x81, 0x7b, 0x2e, 0x2e, 0x12, + 0x2c, 0x49, 0x35, 0x26, 0x1b, 0x81, 0x1a, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x44, 0x62, 0xe5, 0xe5, + 0xe5, 0xe5, 0x62, 0x44, 0x36, 0x58, 0x3e, 0x21, 0x6b, 0x3d, 0x4e, 0x3b, 0x3c, 0x4e, 0x3c, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, 0x03, 0x9b, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x36, 0xff, 0xa6, 0x01, 0xee, 0x02, 0xb5, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, + 0x00, 0x53, 0x40, 0x32, 0x0a, 0x0e, 0x19, 0x08, 0x07, 0x06, 0x09, 0x12, 0x0c, 0x11, 0x0d, 0x16, + 0x00, 0x01, 0x15, 0x03, 0x02, 0x0e, 0x18, 0x19, 0x17, 0x13, 0x44, 0x05, 0x18, 0x08, 0x07, 0x00, + 0x09, 0x40, 0x10, 0x01, 0x10, 0x48, 0x0c, 0x17, 0x17, 0x04, 0x13, 0x48, 0x05, 0x02, 0x0d, 0x14, + 0x48, 0x04, 0x08, 0x02, 0x01, 0xb6, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x32, 0x3f, 0xed, 0x12, 0x39, + 0x2f, 0x33, 0xed, 0x5d, 0x32, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x32, 0x11, 0x12, 0x17, 0x39, + 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x33, 0x07, 0x27, 0x37, 0x23, 0x11, 0x21, 0x37, 0x17, 0x03, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x01, 0x33, 0x37, 0x23, 0x11, 0x33, 0x37, 0x23, 0xef, 0x22, 0x4c, + 0x19, 0x64, 0x01, 0x4e, 0x1c, 0x4e, 0x6f, 0x31, 0x57, 0x42, 0xb5, 0xfe, 0xe5, 0x77, 0x35, 0xac, + 0x0f, 0x42, 0x51, 0x5a, 0x1b, 0x3f, 0x02, 0x6b, 0x4a, 0x1a, 0xfe, 0xdf, 0x66, 0xae, 0x66, 0x01, + 0x7a, 0x8b, 0xfe, 0x61, 0xae, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x16, 0xff, 0xb0, 0x01, 0xdb, + 0x02, 0x24, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x37, 0x00, 0x75, 0x40, 0x4a, 0x2e, 0x53, + 0x18, 0x20, 0x10, 0x40, 0x10, 0x60, 0x10, 0x80, 0x10, 0x04, 0x10, 0x39, 0x12, 0x24, 0x1e, 0x37, + 0x1f, 0x36, 0x21, 0x20, 0x08, 0x38, 0x09, 0x0a, 0x31, 0x08, 0x32, 0x07, 0x11, 0x07, 0x39, 0x25, + 0x25, 0x38, 0x39, 0x33, 0x2d, 0x53, 0x00, 0x38, 0x36, 0x57, 0x21, 0x07, 0x1f, 0xb6, 0x37, 0x11, + 0x73, 0x24, 0x32, 0x32, 0x05, 0x18, 0x3f, 0x14, 0x01, 0x14, 0x57, 0x1b, 0x07, 0x0a, 0x0a, 0x08, + 0xac, 0x4f, 0x28, 0x01, 0x28, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x3f, 0xed, + 0x5d, 0xc5, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, + 0x11, 0x12, 0x39, 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x10, 0xd6, 0x5d, 0xc6, 0xed, 0x31, + 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x23, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x07, + 0x27, 0x37, 0x26, 0x26, 0x37, 0x37, 0x22, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x33, 0x26, 0x26, + 0x27, 0x07, 0x07, 0x16, 0x16, 0x17, 0x37, 0x16, 0x26, 0x3f, 0x50, 0x2a, 0x1c, 0x14, 0x16, 0x47, + 0x16, 0x36, 0x39, 0x02, 0x01, 0xc2, 0x1c, 0x16, 0x20, 0x25, 0x42, 0x17, 0x11, 0x15, 0x59, 0x33, + 0x15, 0x23, 0x11, 0x19, 0x44, 0x16, 0x3d, 0x3b, 0xcd, 0x20, 0x03, 0x06, 0x04, 0x17, 0x22, 0x17, + 0x0d, 0x03, 0xd0, 0x02, 0x0d, 0x0e, 0x18, 0x98, 0x02, 0x0c, 0x0d, 0x14, 0xe7, 0x3e, 0x5e, 0x3f, + 0x20, 0x03, 0x45, 0x16, 0x40, 0x1a, 0x6e, 0x55, 0x0b, 0x19, 0x0b, 0x56, 0x06, 0x0d, 0x0a, 0x6c, + 0x0b, 0x13, 0x04, 0x04, 0x4b, 0x17, 0x46, 0x1d, 0x74, 0x76, 0x62, 0x01, 0x11, 0x1c, 0x24, 0x12, + 0x14, 0x27, 0x10, 0x4b, 0x52, 0x12, 0x20, 0x0b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, + 0xff, 0xf3, 0x01, 0xe2, 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x3a, 0x40, 0x1e, 0x15, 0x14, 0x18, 0x44, + 0x03, 0x1b, 0x01, 0x1d, 0x19, 0x0c, 0x1c, 0x00, 0x40, 0x17, 0x01, 0x17, 0x72, 0x03, 0x14, 0x14, + 0x09, 0x18, 0x48, 0x1a, 0x02, 0x0d, 0x10, 0x4a, 0x09, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0x33, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xc6, 0xc6, 0x10, 0xd6, 0xde, 0xc0, 0xfd, + 0xd0, 0xc5, 0x31, 0x30, 0x01, 0x33, 0x15, 0x23, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x21, 0x01, + 0x9a, 0x48, 0x48, 0x16, 0x31, 0x4e, 0x39, 0x39, 0x4d, 0x1c, 0x2f, 0x17, 0x35, 0x1d, 0x2a, 0x33, + 0x77, 0x77, 0xc4, 0x01, 0x3f, 0x01, 0x78, 0x62, 0x47, 0x2d, 0x50, 0x3c, 0x23, 0x20, 0x17, 0x62, + 0x10, 0x1e, 0x33, 0x45, 0x40, 0x62, 0x8d, 0x66, 0x00, 0x02, 0x00, 0x31, 0xff, 0x56, 0x01, 0xdf, + 0x02, 0xac, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x77, 0x40, 0x10, 0x27, 0x40, 0x14, 0x00, 0x4d, 0x1d, + 0x40, 0x14, 0x00, 0x4d, 0x1c, 0x40, 0x14, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, + 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x14, 0x00, 0x4d, 0x1c, 0x54, 0x22, 0x28, 0x10, 0x44, + 0x1b, 0x19, 0x18, 0x44, 0x14, 0x15, 0x11, 0x08, 0x28, 0x1f, 0x58, 0x25, 0x00, 0x1b, 0x11, 0x73, + 0x18, 0x12, 0x15, 0x48, 0x16, 0x0a, 0x09, 0x0c, 0x4a, 0x05, 0x92, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xfd, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0xd0, 0xd5, 0xfd, 0xcd, 0xd0, + 0xed, 0x10, 0xd4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x25, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, + 0x35, 0x33, 0x35, 0x23, 0x35, 0x21, 0x15, 0x33, 0x15, 0x23, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x90, 0x1c, 0x31, 0x43, 0x27, 0x30, 0x52, 0x26, 0x26, + 0x19, 0x47, 0x1d, 0x1f, 0x22, 0xbe, 0xbe, 0xbe, 0x01, 0x39, 0x4f, 0x4f, 0x0f, 0x2e, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x18, 0x13, 0x68, 0x0e, 0x19, 0x25, + 0x32, 0xaf, 0x53, 0x55, 0x66, 0xbb, 0x53, 0x01, 0x95, 0x24, 0x2a, 0x2a, 0x24, 0x25, 0x2a, 0x2a, + 0x00, 0x02, 0x00, 0x1b, 0xff, 0x59, 0x02, 0x0a, 0x02, 0x79, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x2a, + 0x40, 0x16, 0x27, 0x46, 0x06, 0x0e, 0x32, 0x1d, 0x46, 0x00, 0x31, 0x22, 0x4a, 0x1a, 0x09, 0x0e, + 0x0a, 0x4a, 0x11, 0x92, 0x2c, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0xc5, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xc4, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x35, 0x06, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x1b, 0x6c, 0x61, 0x64, 0x6a, 0x10, 0x11, 0x09, 0x12, 0x0b, + 0x0d, 0x13, 0x22, 0x0b, 0x29, 0x34, 0x1d, 0x0b, 0x14, 0x2e, 0x1a, 0x64, 0x6a, 0x7d, 0x06, 0x11, + 0x1f, 0x1a, 0x1a, 0x20, 0x11, 0x06, 0x06, 0x11, 0x20, 0x1a, 0x1a, 0x1f, 0x11, 0x06, 0x01, 0x36, + 0xa0, 0xa3, 0xa3, 0xa0, 0xfe, 0xda, 0x2d, 0x22, 0x02, 0x05, 0x64, 0x08, 0x03, 0x17, 0x2c, 0x3f, + 0x29, 0x0e, 0x11, 0x0e, 0xa3, 0xa0, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, + 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x5b, 0x01, 0xfe, + 0x01, 0xe0, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x2a, 0x40, 0x16, 0x18, 0x27, 0x51, 0x08, 0x0f, 0x2e, + 0x20, 0x53, 0x00, 0x2d, 0x23, 0x57, 0x1b, 0x07, 0x0c, 0x4a, 0x14, 0x92, 0x2a, 0x57, 0x05, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xc6, 0xd6, 0xfd, 0xc0, + 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, + 0x17, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x37, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x1f, 0x1c, 0x37, 0x50, 0x34, + 0x2d, 0x62, 0x20, 0x0c, 0x14, 0x14, 0x12, 0x13, 0x0a, 0x18, 0x18, 0x14, 0x06, 0x3f, 0x42, 0x15, + 0x2f, 0x16, 0x2c, 0x41, 0x2d, 0x16, 0x7d, 0x26, 0x26, 0x13, 0x22, 0x0c, 0x08, 0x1c, 0x0e, 0x2d, + 0x2e, 0xeb, 0x36, 0x5b, 0x40, 0x24, 0x0e, 0x0b, 0xfe, 0x42, 0x1d, 0x23, 0x06, 0x67, 0x04, 0x05, + 0x03, 0x01, 0x45, 0x51, 0x1c, 0x0b, 0x0d, 0x23, 0x40, 0x5b, 0x34, 0x41, 0x47, 0x0a, 0x08, 0x01, + 0x02, 0x01, 0x03, 0x51, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe0, 0x02, 0x72, 0x00, 0x1b, + 0x00, 0x25, 0x00, 0x4e, 0x40, 0x2e, 0x0d, 0x40, 0x0b, 0x00, 0x4d, 0x0f, 0x0c, 0x44, 0x0b, 0x1c, + 0x46, 0x03, 0x06, 0x60, 0x0b, 0x80, 0x0b, 0xa0, 0x0b, 0xb0, 0x0b, 0x04, 0x0b, 0x27, 0x22, 0x10, + 0x44, 0x16, 0x13, 0x14, 0x26, 0x11, 0x08, 0x13, 0x0f, 0x48, 0x16, 0x23, 0x23, 0x00, 0x0c, 0x08, + 0x1f, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x3f, 0x01, + 0x10, 0xd6, 0xdd, 0xc0, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0x32, 0xd6, 0xed, 0x10, 0xed, 0x32, 0x31, + 0x30, 0x2b, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x26, 0x26, 0x27, + 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x11, 0x3e, 0x03, 0x17, 0x34, 0x26, 0x23, 0x22, 0x07, + 0x15, 0x33, 0x32, 0x36, 0xf2, 0x5d, 0x71, 0x2c, 0x33, 0x10, 0x23, 0x22, 0x1e, 0x0c, 0x81, 0x17, + 0x34, 0x23, 0x1c, 0x7b, 0x48, 0x48, 0x11, 0x29, 0x29, 0x27, 0x5f, 0x2d, 0x24, 0x0d, 0x10, 0x13, + 0x30, 0x2b, 0x02, 0x72, 0x63, 0x68, 0x36, 0x58, 0x17, 0x1a, 0x3f, 0x45, 0x45, 0x1f, 0x3c, 0x6f, + 0x39, 0xe4, 0xe4, 0x66, 0x01, 0x18, 0x04, 0x07, 0x03, 0x02, 0xca, 0x31, 0x2e, 0x03, 0xba, 0x31, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xcb, 0x01, 0xdf, 0x00, 0x1b, 0x00, 0x35, 0x40, 0x1b, + 0x1b, 0x08, 0x0b, 0x0c, 0x51, 0x12, 0x0f, 0x10, 0x1c, 0x0f, 0x0b, 0x73, 0x12, 0x0a, 0x0a, 0x16, + 0x0d, 0x00, 0x2f, 0x05, 0x01, 0x05, 0x53, 0x16, 0x0b, 0x0d, 0x08, 0x00, 0x3f, 0x3f, 0xfd, 0x5d, + 0xc6, 0x11, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc5, 0xd0, + 0xc5, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x06, 0x07, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, + 0x35, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x01, 0xb5, 0x0c, 0x20, + 0x23, 0x20, 0x0b, 0x1b, 0x39, 0x1d, 0xab, 0xab, 0x7b, 0x3d, 0x3d, 0x31, 0x71, 0x45, 0x0a, 0x27, + 0x2c, 0x2a, 0x0e, 0x01, 0x5b, 0x03, 0x05, 0x04, 0x02, 0x05, 0x08, 0x5c, 0x53, 0xad, 0xad, 0x53, + 0xb7, 0x12, 0x16, 0x01, 0x04, 0x06, 0x04, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x19, 0x00, 0x20, 0x00, 0xb2, 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0x40, 0x1d, 0x0f, + 0x00, 0x4d, 0x1d, 0x20, 0x10, 0x00, 0x4d, 0x1c, 0x40, 0x0f, 0x00, 0x4d, 0x1c, 0x40, 0x0c, 0x00, + 0x4d, 0x1c, 0x20, 0x0b, 0x00, 0x4d, 0x14, 0x20, 0x0c, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xe0, 0xb3, + 0x0c, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xd0, 0xb3, 0x0c, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xe0, 0x40, + 0x3f, 0x0e, 0x00, 0x4d, 0x01, 0x20, 0x0d, 0x00, 0x4d, 0x15, 0x16, 0x22, 0x1e, 0x11, 0x09, 0x0c, + 0x04, 0x0a, 0x17, 0x00, 0x12, 0x1d, 0x04, 0x1a, 0x19, 0x0a, 0x19, 0x1a, 0x19, 0x1a, 0x0a, 0x03, + 0x21, 0x22, 0x0e, 0x0d, 0x21, 0x04, 0x44, 0x05, 0x21, 0x0c, 0x12, 0x12, 0x17, 0x09, 0x1d, 0x1d, + 0x00, 0x73, 0x03, 0x06, 0x1a, 0x17, 0x1a, 0x17, 0x1a, 0x04, 0x15, 0x02, 0x0e, 0x02, 0x04, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0xed, 0x32, 0x11, 0x33, + 0x11, 0x33, 0x11, 0x33, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xdc, 0xcd, 0x11, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x17, 0x39, 0x10, 0xdc, 0xc5, 0x31, 0x30, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x06, 0x06, 0x07, 0x15, 0x23, + 0x35, 0x26, 0x26, 0x27, 0x23, 0x35, 0x33, 0x27, 0x33, 0x16, 0x16, 0x17, 0x33, 0x36, 0x36, 0x37, + 0x33, 0x07, 0x33, 0x15, 0x07, 0x36, 0x36, 0x37, 0x23, 0x16, 0x16, 0x01, 0x95, 0x13, 0x2e, 0x1b, + 0x7c, 0x1a, 0x2d, 0x13, 0x5a, 0x35, 0x29, 0x85, 0x08, 0x10, 0x09, 0x84, 0x08, 0x11, 0x08, 0x7f, + 0x28, 0x34, 0xed, 0x08, 0x14, 0x08, 0x4c, 0x09, 0x14, 0x01, 0xa8, 0x2d, 0x61, 0x2e, 0xec, 0xeb, + 0x2e, 0x62, 0x2d, 0x58, 0x6b, 0x1a, 0x37, 0x1a, 0x1c, 0x38, 0x17, 0x6b, 0x58, 0x61, 0x10, 0x36, + 0x1b, 0x18, 0x35, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x58, 0x01, 0xeb, 0x01, 0xd6, 0x00, 0x27, + 0x00, 0x2e, 0x00, 0x85, 0x40, 0x17, 0x2a, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x27, 0x40, 0x0c, 0x00, + 0x4d, 0x27, 0x38, 0x0b, 0x00, 0x4d, 0x26, 0x20, 0x0b, 0x0c, 0x00, 0x4c, 0x21, 0xb8, 0xff, 0xc0, + 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x20, 0xb8, 0xff, 0xc0, 0x40, 0x32, 0x0b, 0x0c, 0x00, 0x4c, 0x27, + 0x51, 0x00, 0x02, 0x30, 0x2c, 0x16, 0x19, 0x1c, 0x04, 0x2f, 0x01, 0x04, 0x07, 0x24, 0x2b, 0x05, + 0x30, 0x28, 0x28, 0x2f, 0x30, 0x20, 0x51, 0x1f, 0x1b, 0x0f, 0x2f, 0x2b, 0x2b, 0x19, 0x19, 0x04, + 0x7d, 0x1c, 0x01, 0x24, 0x27, 0x0a, 0x20, 0x0a, 0x10, 0x13, 0x4a, 0x0c, 0x0f, 0x00, 0x3f, 0xfd, + 0xc6, 0x3f, 0x3f, 0xd4, 0x32, 0x32, 0xed, 0x32, 0x2f, 0x32, 0x2f, 0x01, 0x10, 0xc6, 0xd6, 0xde, + 0xed, 0x11, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x18, 0x10, 0xd6, 0xde, + 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x07, 0x33, 0x15, 0x23, 0x06, 0x06, + 0x07, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, + 0x27, 0x23, 0x35, 0x33, 0x26, 0x26, 0x27, 0x33, 0x16, 0x16, 0x17, 0x33, 0x36, 0x36, 0x37, 0x03, + 0x36, 0x36, 0x37, 0x23, 0x16, 0x16, 0x01, 0xcf, 0x26, 0x42, 0x56, 0x14, 0x2f, 0x1a, 0x13, 0x25, + 0x2d, 0x37, 0x25, 0x1f, 0x33, 0x11, 0x17, 0x14, 0x1f, 0x12, 0x24, 0x2c, 0x0d, 0x18, 0x33, 0x17, + 0x62, 0x46, 0x0b, 0x15, 0x0a, 0x80, 0x08, 0x13, 0x0c, 0x69, 0x08, 0x0d, 0x08, 0x47, 0x06, 0x0e, + 0x05, 0x3f, 0x09, 0x14, 0x01, 0xd6, 0x92, 0x4e, 0x43, 0x87, 0x3b, 0x28, 0x3a, 0x25, 0x12, 0x0a, + 0x08, 0x67, 0x09, 0x07, 0x30, 0x21, 0x30, 0x74, 0x40, 0x4e, 0x23, 0x49, 0x26, 0x22, 0x4a, 0x26, + 0x24, 0x4a, 0x24, 0xfe, 0xbf, 0x16, 0x33, 0x18, 0x19, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, + 0xff, 0x5b, 0x01, 0xba, 0x01, 0xd6, 0x00, 0x25, 0x00, 0x40, 0x40, 0x21, 0x21, 0x53, 0x09, 0x13, + 0x27, 0x0e, 0x05, 0x00, 0x00, 0x27, 0x1b, 0x06, 0x26, 0x1c, 0x1f, 0x57, 0x16, 0x0e, 0x00, 0x25, + 0x25, 0x00, 0x0e, 0x03, 0x08, 0x16, 0x0f, 0x08, 0x0a, 0x06, 0x55, 0x07, 0x0a, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xc6, 0xc6, 0x12, + 0x39, 0x2f, 0x39, 0x39, 0x10, 0xd6, 0xc4, 0xed, 0x31, 0x30, 0x37, 0x3e, 0x03, 0x37, 0x23, 0x35, + 0x21, 0x15, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, 0x92, 0x0f, 0x26, 0x27, 0x24, 0x0d, 0xe9, + 0x01, 0x7a, 0x0b, 0x22, 0x29, 0x2b, 0x13, 0x21, 0x3a, 0x2a, 0x19, 0x7e, 0x70, 0x15, 0x30, 0x2f, + 0x2a, 0x0f, 0x1e, 0x1d, 0x50, 0x23, 0x70, 0x43, 0x40, 0x28, 0xcd, 0x10, 0x2b, 0x2d, 0x2a, 0x11, + 0x66, 0x4b, 0x0f, 0x2b, 0x32, 0x35, 0x18, 0x08, 0x1d, 0x2d, 0x3c, 0x25, 0x63, 0x61, 0x06, 0x09, + 0x0d, 0x08, 0x61, 0x0d, 0x0f, 0x61, 0x35, 0x2f, 0x00, 0x01, 0x00, 0x69, 0x02, 0x0f, 0x01, 0x8b, + 0x02, 0xa3, 0x00, 0x13, 0x00, 0x1b, 0x40, 0x0b, 0x07, 0x06, 0x15, 0x0d, 0x0e, 0x14, 0x0d, 0x07, + 0x0a, 0x00, 0x98, 0x00, 0x3f, 0xd5, 0xce, 0xce, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xc5, 0x31, + 0x30, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x23, 0x35, + 0x34, 0x3e, 0x02, 0xfa, 0x1f, 0x35, 0x27, 0x16, 0x5a, 0x03, 0x1e, 0x16, 0x16, 0x1e, 0x02, 0x5b, + 0x16, 0x27, 0x35, 0x02, 0xa3, 0x13, 0x25, 0x34, 0x21, 0x07, 0x26, 0x19, 0x19, 0x26, 0x07, 0x21, + 0x34, 0x25, 0x13, 0x00, 0x00, 0x02, 0x00, 0x4f, 0x01, 0xff, 0x01, 0xaa, 0x02, 0xb2, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x1a, 0x40, 0x0b, 0x01, 0x03, 0x05, 0x07, 0x08, 0x06, 0x04, 0x9f, 0x02, 0x00, + 0x9f, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x17, + 0x07, 0x27, 0x27, 0x17, 0x07, 0x27, 0x01, 0x3e, 0x6c, 0x36, 0x7a, 0x67, 0x6c, 0x36, 0x7a, 0x02, + 0xb2, 0x88, 0x2b, 0x70, 0x43, 0x88, 0x2b, 0x70, 0x00, 0x03, 0x00, 0xa1, 0x02, 0x07, 0x01, 0x56, + 0x03, 0x3e, 0x00, 0x03, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2b, 0x40, 0x16, 0x04, 0x82, 0xcf, 0x18, + 0x01, 0x18, 0x1e, 0x82, 0x0e, 0x24, 0x00, 0x02, 0x24, 0x09, 0x81, 0x21, 0x1b, 0x81, 0x13, 0x01, + 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xde, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xfd, + 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x17, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x52, 0x98, 0x18, 0x91, 0x23, 0x0f, 0x1a, 0x20, 0x12, 0x12, + 0x20, 0x19, 0x0f, 0x0f, 0x19, 0x20, 0x12, 0x12, 0x20, 0x1a, 0x0f, 0x38, 0x15, 0x0e, 0x0d, 0x16, + 0x16, 0x0d, 0x0e, 0x15, 0x02, 0xfd, 0x39, 0x2f, 0x4b, 0xdf, 0x15, 0x21, 0x17, 0x0b, 0x0b, 0x17, + 0x21, 0x15, 0x15, 0x21, 0x17, 0x0b, 0x0b, 0x17, 0x21, 0x15, 0x12, 0x13, 0x13, 0x12, 0x12, 0x13, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6d, 0x02, 0x0b, 0x01, 0x87, 0x02, 0xdc, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x3e, 0x40, 0x25, 0x1a, 0xb0, 0x1b, 0x01, 0x6f, 0x1b, 0x01, 0x30, + 0x1b, 0x01, 0x1b, 0x1c, 0x0c, 0x4a, 0x12, 0x00, 0x4a, 0xcf, 0x06, 0xdf, 0x06, 0x02, 0x50, 0x06, + 0x01, 0x06, 0x1c, 0x19, 0x1a, 0x0f, 0x4a, 0x15, 0x8b, 0x03, 0x4a, 0x09, 0x8b, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0xde, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0xfd, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0x5d, + 0x5d, 0xcd, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x15, 0x23, + 0xdf, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, + 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x02, 0x44, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x7e, 0x47, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x86, + 0x02, 0x0c, 0x01, 0x6e, 0x02, 0xdc, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x40, 0x0c, 0x00, 0x4a, + 0x06, 0x0e, 0x0c, 0x10, 0x0c, 0x0f, 0x03, 0x4a, 0x09, 0x8b, 0x00, 0x3f, 0xed, 0xde, 0xc5, 0x01, + 0x10, 0xd6, 0xcd, 0xd4, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x27, 0x33, 0x15, 0x23, 0x01, 0x33, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, + 0x22, 0xad, 0xe8, 0xe8, 0x02, 0x44, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, 0x7e, 0x47, 0x00, + 0x00, 0x03, 0x00, 0x4a, 0x02, 0x0f, 0x01, 0xa9, 0x03, 0x12, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, + 0x00, 0x2d, 0x40, 0x18, 0x04, 0x4a, 0xa0, 0x0a, 0x01, 0x0a, 0x1d, 0x01, 0x03, 0x16, 0x4a, 0x10, + 0x1c, 0x19, 0x4a, 0x13, 0x8b, 0x0d, 0x4a, 0x07, 0x8b, 0x02, 0x00, 0xb7, 0x00, 0x3f, 0xc5, 0x3f, + 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x13, + 0x17, 0x07, 0x27, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xc5, 0x6b, 0x39, 0x78, 0xb8, + 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xed, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, + 0x22, 0x03, 0x12, 0x98, 0x2a, 0x89, 0x92, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, + 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4a, 0x02, 0x0f, 0x01, 0xa9, + 0x03, 0x12, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x37, 0x40, 0x21, 0x10, 0x4a, 0xaf, 0x16, + 0xbf, 0x16, 0xff, 0x16, 0x03, 0x16, 0x04, 0x4a, 0x0a, 0x1c, 0x00, 0xb0, 0x02, 0xe0, 0x02, 0x02, + 0x02, 0x1c, 0x13, 0x4a, 0x19, 0x8b, 0x07, 0x4a, 0x0d, 0x8b, 0x01, 0x03, 0xb7, 0x00, 0x3f, 0xc5, + 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd4, 0x5d, 0xc5, 0x10, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, 0x31, + 0x30, 0x01, 0x07, 0x27, 0x37, 0x07, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x74, 0x78, + 0x38, 0x6a, 0x72, 0x21, 0x18, 0x18, 0x21, 0x21, 0x18, 0x18, 0x21, 0xed, 0x22, 0x17, 0x17, 0x22, + 0x22, 0x17, 0x17, 0x22, 0x02, 0xd9, 0x89, 0x2a, 0x98, 0xcb, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, + 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4a, + 0x02, 0x0f, 0x01, 0xa9, 0x03, 0x00, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x4a, 0xb9, 0x00, + 0x1a, 0xff, 0xc0, 0xb4, 0x0f, 0x00, 0x4d, 0x1c, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x1e, 0x21, + 0x48, 0x18, 0x1e, 0x0c, 0x4a, 0xaf, 0x12, 0xbf, 0x12, 0xdf, 0x12, 0xff, 0x12, 0x04, 0x12, 0x00, + 0x4a, 0x06, 0x1e, 0x1b, 0x1a, 0x19, 0x1d, 0xb4, 0x0f, 0x4a, 0x15, 0x8b, 0x03, 0x4a, 0x09, 0x8b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0xc5, 0xc5, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, + 0x10, 0xd4, 0x2b, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x25, 0x37, 0x17, 0x37, 0x17, 0x07, 0xbc, 0x21, 0x18, 0x18, 0x21, 0x21, 0x18, 0x18, 0x21, 0xed, + 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xce, 0x2c, 0x55, 0x57, 0x2d, 0x84, 0x02, + 0x47, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, + 0x6b, 0x34, 0x41, 0x41, 0x34, 0x72, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6f, 0x02, 0x0d, 0x01, 0x85, + 0x02, 0xdc, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x3e, 0xb9, 0x00, 0x15, 0xff, 0xc0, 0xb3, 0x0a, 0x00, + 0x4d, 0x15, 0xb8, 0xff, 0xe0, 0x40, 0x18, 0x09, 0x00, 0x4d, 0x1e, 0x1c, 0x20, 0x2f, 0x00, 0x3f, + 0x00, 0x02, 0x00, 0x0e, 0x20, 0x05, 0x18, 0x1b, 0x1f, 0x0d, 0x0a, 0x13, 0x1d, 0x1f, 0x98, 0x00, + 0x3f, 0xc5, 0xde, 0xdd, 0xce, 0x10, 0xde, 0xde, 0xc5, 0x01, 0x10, 0xde, 0xcd, 0x5d, 0x10, 0xde, + 0xcd, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, + 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x27, 0x33, 0x15, 0x23, + 0x01, 0x85, 0x05, 0x10, 0x16, 0x1e, 0x12, 0x0d, 0x18, 0x17, 0x18, 0x0c, 0x10, 0x12, 0x08, 0x31, + 0x04, 0x10, 0x18, 0x1e, 0x12, 0x0d, 0x18, 0x16, 0x17, 0x0d, 0x10, 0x13, 0x08, 0xcf, 0xe8, 0xe8, + 0x02, 0x62, 0x0c, 0x1b, 0x17, 0x10, 0x08, 0x0a, 0x08, 0x13, 0x0e, 0x27, 0x0c, 0x1a, 0x14, 0x0d, + 0x08, 0x0b, 0x08, 0x13, 0x0e, 0x5b, 0x47, 0x00, 0x00, 0x01, 0x00, 0x8b, 0x02, 0xa5, 0x01, 0x69, + 0x03, 0x3d, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xcd, + 0x01, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x69, 0xc3, 0x1b, 0xbe, 0x02, + 0xe3, 0x3e, 0x3e, 0x5a, 0x00, 0x01, 0x00, 0x77, 0x02, 0xa5, 0x01, 0x7d, 0x03, 0x3d, 0x00, 0x05, + 0x00, 0x14, 0xb7, 0x00, 0x04, 0x06, 0x03, 0x01, 0x02, 0x05, 0x86, 0x00, 0x3f, 0xdd, 0xcd, 0xcd, + 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x07, 0x27, 0x37, 0x01, 0x7d, 0x26, 0x5c, + 0x5e, 0x26, 0x84, 0x02, 0xde, 0x39, 0x36, 0x36, 0x39, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, + 0x02, 0xa5, 0x01, 0x7d, 0x03, 0x3d, 0x00, 0x05, 0x00, 0x16, 0x40, 0x09, 0x05, 0x01, 0x06, 0x04, + 0x86, 0x00, 0x03, 0x02, 0x86, 0x00, 0x3f, 0xdd, 0xc5, 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, + 0x13, 0x27, 0x37, 0x17, 0x37, 0x17, 0xfb, 0x84, 0x26, 0x5e, 0x5c, 0x26, 0x02, 0xa5, 0x60, 0x38, + 0x36, 0x36, 0x38, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x02, 0x84, 0x01, 0xa7, 0x03, 0x3e, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x43, 0x40, 0x2a, 0x06, 0x4a, 0x4f, 0x00, 0x01, 0x00, 0x4f, 0x19, + 0x01, 0x19, 0x0f, 0x1b, 0x01, 0x1b, 0x12, 0x4a, 0x40, 0x0c, 0x01, 0x0c, 0x1c, 0x1a, 0x18, 0x86, + 0x15, 0x4a, 0xc0, 0x0f, 0xd0, 0x0f, 0x02, 0x0f, 0xb8, 0x09, 0x4a, 0xc0, 0x03, 0xd0, 0x03, 0x02, + 0x03, 0xb8, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, + 0xd4, 0x71, 0xc5, 0x5d, 0xd4, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x37, 0x17, 0x07, 0x27, 0x01, 0x35, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, + 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0x93, 0x56, 0x2d, 0x5e, 0x02, 0xbc, 0x1a, 0x1e, + 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x9c, 0x50, 0x35, + 0x45, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x02, 0x84, 0x01, 0xa7, 0x03, 0x3e, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x4b, 0x40, 0x32, 0x0c, 0x4a, 0x2f, 0x12, 0x01, 0x2f, 0x12, 0x3f, + 0x12, 0x4f, 0x12, 0xaf, 0x12, 0xbf, 0x12, 0x05, 0x12, 0x4f, 0x18, 0x01, 0x18, 0x1a, 0x00, 0x4a, + 0x40, 0x06, 0x01, 0x06, 0x1c, 0x19, 0x1b, 0x86, 0x0f, 0x4a, 0xc0, 0x15, 0xd0, 0x15, 0x02, 0x15, + 0xb8, 0x03, 0x4a, 0xc0, 0x09, 0xd0, 0x09, 0x02, 0x09, 0xb8, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, + 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xc5, 0x5d, 0xd4, 0x5d, 0x71, 0xed, 0x31, + 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x07, 0x27, 0x37, 0xbf, 0x22, 0x17, + 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0x5f, + 0x5d, 0x2d, 0x55, 0x02, 0xbc, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, + 0x1a, 0x1a, 0x1e, 0x1e, 0x28, 0x45, 0x35, 0x50, 0x00, 0x03, 0x00, 0x4d, 0x02, 0x84, 0x01, 0xa7, + 0x03, 0x3e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x6a, 0x40, 0x4a, 0x12, 0x4a, 0xdf, 0x0c, + 0x01, 0xa0, 0x0c, 0x01, 0x4f, 0x0c, 0x5f, 0x0c, 0x7f, 0x0c, 0x03, 0x0c, 0x1f, 0x4f, 0x1c, 0x5f, + 0x1c, 0x02, 0x1c, 0x18, 0x1e, 0x00, 0x4a, 0x00, 0x06, 0x10, 0x06, 0x02, 0x40, 0x06, 0x50, 0x06, + 0x60, 0x06, 0xb0, 0x06, 0xc0, 0x06, 0x05, 0x06, 0x1e, 0x1b, 0x86, 0x8f, 0x1d, 0x9f, 0x1d, 0x02, + 0x1d, 0x1a, 0x19, 0x86, 0x0f, 0x4a, 0xc0, 0x15, 0xd0, 0x15, 0x02, 0x15, 0xb8, 0x03, 0x4a, 0xc0, + 0x09, 0xd0, 0x09, 0x02, 0x09, 0xb8, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xdd, 0xc5, + 0x5d, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xed, 0x10, 0xd4, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0x5d, + 0x5d, 0xed, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x37, 0x17, 0x37, + 0x17, 0x07, 0xbf, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, 0x22, + 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfd, 0x25, 0x31, 0x2f, 0x27, 0x56, 0x02, 0xbc, 0x1a, 0x1e, 0x1e, + 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x3a, 0x2e, 0x23, 0x23, + 0x2e, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x0f, 0x0d, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf6, + 0x40, 0x0d, 0x0e, 0x20, 0x00, 0x0a, 0x50, 0x02, 0x01, 0x18, 0x4f, 0x01, 0x01, 0x0c, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x01, 0x00, 0x12, 0xff, 0xfa, 0x01, 0xe7, 0x02, 0x6b, 0x00, 0x23, + 0x00, 0x5a, 0x40, 0x39, 0x19, 0x40, 0x09, 0x00, 0x4d, 0x18, 0x40, 0x09, 0x00, 0x4d, 0x17, 0x40, + 0x09, 0x00, 0x4d, 0x30, 0x0a, 0x01, 0x0f, 0x0a, 0x01, 0x0a, 0x46, 0x18, 0x0f, 0x11, 0x01, 0x11, + 0x1e, 0x01, 0x20, 0x03, 0x01, 0x03, 0x44, 0x21, 0x22, 0x24, 0x20, 0x08, 0x05, 0x4a, 0x1b, 0x1b, + 0x00, 0x15, 0x4a, 0x0f, 0x09, 0x21, 0x4f, 0x02, 0x01, 0x02, 0x48, 0x00, 0x02, 0x00, 0x3f, 0xfd, + 0x5d, 0xc0, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xfd, 0x5d, 0xc6, + 0xd0, 0xc6, 0x5d, 0xd6, 0xed, 0x5d, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x01, 0x15, 0x23, 0x15, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x32, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0x87, + 0xaa, 0x1f, 0x1f, 0x2d, 0x4b, 0x36, 0x1e, 0x12, 0x27, 0x40, 0x2d, 0x17, 0x1b, 0x05, 0x07, 0x09, + 0x08, 0x23, 0x25, 0x39, 0x2e, 0x0b, 0x18, 0x0d, 0x7b, 0x50, 0x02, 0x6b, 0x66, 0x85, 0x06, 0x19, + 0x31, 0x49, 0x30, 0x2f, 0x4a, 0x34, 0x1c, 0x03, 0x64, 0x01, 0x26, 0x2f, 0x38, 0x2b, 0x04, 0x02, + 0xfe, 0xee, 0x02, 0x05, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x01, 0xe4, + 0x03, 0x3e, 0x02, 0x26, 0x02, 0xc6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x3a, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x3b, 0x0c, 0x0a, 0x08, 0x02, 0x50, 0x01, 0x01, 0x0b, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, 0x02, 0x79, 0x00, 0x22, + 0x00, 0x33, 0x40, 0x1a, 0x0d, 0x20, 0x24, 0x17, 0x16, 0x46, 0x19, 0x46, 0x03, 0x23, 0x18, 0x57, + 0x17, 0x17, 0x08, 0x00, 0x0e, 0x11, 0x4a, 0x08, 0x03, 0x1f, 0x1c, 0x4a, 0x00, 0x09, 0x00, 0x3f, + 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xde, 0xed, 0xfd, 0xc5, + 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x33, 0x15, 0x23, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x01, 0x28, 0x83, 0x8a, 0x2a, 0x4b, 0x67, 0x3d, 0x21, 0x35, 0x28, + 0x1b, 0x07, 0x20, 0x17, 0x41, 0x2a, 0x19, 0x32, 0x2a, 0x1f, 0x06, 0xcc, 0xcd, 0x08, 0x4d, 0x48, + 0x30, 0x3f, 0x13, 0x1f, 0x1a, 0x59, 0x0d, 0xa8, 0x9b, 0x4d, 0x78, 0x53, 0x2b, 0x0b, 0x0e, 0x10, + 0x04, 0x62, 0x0f, 0x15, 0x10, 0x24, 0x3c, 0x2c, 0x6f, 0x50, 0x55, 0x16, 0x0b, 0x61, 0x10, 0x1b, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, 0x02, 0x79, 0x02, 0x06, 0x00, 0x36, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x0e, + 0x20, 0x00, 0x06, 0x50, 0x02, 0x05, 0x18, 0x4f, 0x01, 0x05, 0x0c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xb6, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0xff, 0xf5, 0x01, 0xe0, 0x02, 0x6b, 0x00, 0x1f, + 0x00, 0x2b, 0x00, 0x52, 0x40, 0x33, 0x40, 0x28, 0x50, 0x28, 0x02, 0x28, 0x84, 0xc0, 0x00, 0x01, + 0x00, 0x2d, 0x20, 0x09, 0x85, 0x2f, 0x1b, 0x3f, 0x1b, 0x02, 0x1b, 0x40, 0x0f, 0x13, 0x48, 0x1b, + 0x6f, 0x0a, 0x01, 0x0a, 0x85, 0x1a, 0x11, 0x2c, 0x1d, 0x7d, 0x2b, 0x2b, 0x05, 0x09, 0x73, 0x1b, + 0x02, 0x1a, 0x02, 0x10, 0x09, 0x23, 0x7d, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x5d, 0xd5, 0x2b, 0x71, 0xfd, 0xc5, 0x10, + 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x33, + 0x32, 0x16, 0x27, 0x15, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x01, 0xe0, 0x1b, + 0x2d, 0x3c, 0x21, 0x18, 0x2b, 0x22, 0x33, 0x09, 0x1e, 0x3a, 0x30, 0x0e, 0x1b, 0x15, 0x07, 0x05, + 0x06, 0x04, 0x01, 0xe3, 0x13, 0x4e, 0x51, 0xb2, 0x09, 0x09, 0x15, 0x18, 0x0d, 0x04, 0x22, 0x23, + 0xc2, 0x39, 0x4d, 0x2f, 0x13, 0x05, 0x0a, 0x02, 0x0e, 0xac, 0x65, 0x84, 0x53, 0x2d, 0x0d, 0x5d, + 0x09, 0x1b, 0x1b, 0x15, 0x3b, 0x54, 0x72, 0x4d, 0x77, 0xdc, 0x61, 0x11, 0xf2, 0x03, 0x17, 0x23, + 0x2a, 0x14, 0x43, 0x3a, 0x00, 0x02, 0x00, 0x2e, 0xff, 0xfa, 0x01, 0xe0, 0x02, 0x6b, 0x00, 0x16, + 0x00, 0x22, 0x00, 0x69, 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0x40, 0x26, 0x0b, 0x0e, 0x48, 0x1f, 0x84, + 0x80, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x24, 0x17, 0x6f, 0x13, 0x7f, 0x13, 0x8f, 0x13, 0x03, 0x13, + 0x8f, 0x09, 0xa0, 0x10, 0xb0, 0x10, 0x02, 0x10, 0x0a, 0x0e, 0x40, 0x0d, 0x11, 0x48, 0x0e, 0x8f, + 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x0b, 0x13, 0x48, 0x0d, 0x23, 0x14, 0x7d, 0x22, 0x22, 0x05, + 0x12, 0x02, 0x09, 0x7d, 0x0f, 0x0e, 0x02, 0x0b, 0x08, 0x1a, 0x7d, 0x05, 0x09, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0xd5, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x2b, 0x32, + 0xd6, 0x5d, 0x32, 0xfd, 0x5d, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x31, 0x30, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, + 0x33, 0x32, 0x16, 0x27, 0x15, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x01, 0xe0, + 0x1b, 0x2d, 0x3c, 0x21, 0x18, 0x2b, 0x22, 0x51, 0x57, 0x57, 0x51, 0x58, 0x13, 0x4e, 0x51, 0xb2, + 0x09, 0x09, 0x15, 0x18, 0x0d, 0x04, 0x22, 0x23, 0xc2, 0x39, 0x4d, 0x2f, 0x13, 0x05, 0x0a, 0x01, + 0x27, 0xfe, 0xd0, 0x02, 0x6b, 0xe7, 0xe7, 0xdc, 0x61, 0x11, 0xf2, 0x03, 0x17, 0x23, 0x2a, 0x14, + 0x43, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x19, + 0x00, 0x3a, 0x40, 0x20, 0x00, 0x44, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x17, 0x1b, 0x0d, 0x06, 0x0e, + 0x44, 0x09, 0x0a, 0x1a, 0x03, 0x57, 0x12, 0x12, 0x0c, 0x19, 0x08, 0x09, 0x0e, 0x48, 0x0c, 0x02, + 0x0b, 0x02, 0x08, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xc0, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, + 0x10, 0xd6, 0xd5, 0xfd, 0x32, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x15, 0x23, 0x01, 0x4c, 0x1d, 0x20, 0x09, 0x1c, 0x0d, 0x7b, 0x50, 0x01, 0x75, + 0xaa, 0x12, 0x23, 0x0f, 0x25, 0x3d, 0x2c, 0x18, 0x7b, 0xad, 0x3d, 0x2e, 0x04, 0x04, 0xfe, 0xf0, + 0x02, 0x05, 0x66, 0x66, 0x86, 0x04, 0x03, 0x0f, 0x2d, 0x53, 0x43, 0xb4, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x1d, 0x1b, 0x07, + 0x1a, 0x50, 0x01, 0x08, 0x1c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x03, 0x3e, 0x02, 0x26, 0x02, 0xcb, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0b, 0x13, 0x11, 0x00, 0x09, 0x50, 0x01, + 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, + 0x03, 0x39, 0x02, 0x26, 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x26, 0x2e, 0x17, 0x00, 0x50, 0x01, 0x00, 0x21, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x3e, 0x40, 0x26, 0x09, 0x44, 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x0a, 0x0d, 0x06, 0x44, 0x20, + 0x05, 0x30, 0x05, 0x50, 0x05, 0x03, 0x05, 0x0c, 0x00, 0xa9, 0x50, 0x02, 0x01, 0x02, 0x0c, 0x09, + 0x02, 0x06, 0x02, 0x08, 0x48, 0x00, 0x03, 0x08, 0x01, 0x92, 0x00, 0x3f, 0x3f, 0x33, 0xed, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, + 0x21, 0x15, 0x23, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x32, 0x72, 0x93, + 0x7b, 0xa4, 0x7b, 0xa5, 0xa5, 0x02, 0x6b, 0xfd, 0xfb, 0x02, 0x05, 0xfd, 0x95, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x6b, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x44, + 0xb3, 0x14, 0x46, 0x10, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x09, 0x0f, 0x48, 0x07, 0x1d, 0x01, + 0x18, 0x44, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0a, 0x0e, 0x48, 0x0d, 0x1c, 0x02, 0x4a, 0x17, + 0x17, 0x0a, 0x4f, 0x00, 0x01, 0x00, 0x48, 0x0e, 0x02, 0x11, 0x4a, 0x0a, 0x09, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0x2b, + 0xc4, 0xed, 0x31, 0x30, 0x13, 0x15, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x21, 0x15, 0x03, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x16, 0x16, 0xb1, + 0x2e, 0x38, 0x5b, 0x40, 0x23, 0x7d, 0x76, 0x23, 0x5c, 0x2d, 0x01, 0x5f, 0xac, 0x36, 0x3d, 0x40, + 0x41, 0x2a, 0x08, 0x22, 0x02, 0x05, 0x76, 0x15, 0x30, 0x4d, 0x38, 0x67, 0x66, 0x08, 0x0a, 0x02, + 0x61, 0x66, 0xfe, 0x5e, 0x2e, 0x33, 0x36, 0x2a, 0xbd, 0x01, 0x03, 0x00, 0xff, 0xff, 0x00, 0x36, + 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x72, 0x02, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, + 0x00, 0x00, 0x01, 0xe4, 0x02, 0x6b, 0x00, 0x09, 0x00, 0x35, 0x40, 0x0e, 0x03, 0x04, 0x06, 0x05, + 0x44, 0x00, 0xb0, 0x09, 0xc0, 0x09, 0xd0, 0x09, 0x03, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0e, + 0x12, 0x48, 0x09, 0x0a, 0x00, 0x05, 0x48, 0x07, 0x08, 0x04, 0x48, 0x02, 0x02, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xd5, 0xfd, 0xc5, 0xd0, 0xc5, 0x31, 0x30, 0x37, + 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x7d, 0x01, 0x67, 0xec, 0x86, 0xfe, 0xa6, + 0x66, 0x02, 0x05, 0x66, 0xfe, 0x61, 0x66, 0x66, 0x00, 0x02, 0x00, 0x0f, 0xff, 0x5b, 0x01, 0xe2, + 0x02, 0x6b, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x9f, 0xb9, 0x00, 0x17, 0xff, 0xc0, 0x40, 0x09, 0x0e, + 0x00, 0x4d, 0x15, 0x20, 0x0d, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x08, + 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x0d, 0x00, 0x4d, 0x07, 0x40, 0x0e, 0x00, 0x4d, 0x06, 0x40, 0x0e, + 0x00, 0x4d, 0x05, 0x40, 0x0e, 0x00, 0x4d, 0x04, 0x40, 0x0e, 0x00, 0x4d, 0x40, 0x1a, 0x01, 0x1a, + 0x44, 0x50, 0x08, 0x01, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x35, 0x09, 0x0c, 0x48, 0x08, 0x0a, 0x20, + 0x0d, 0x30, 0x0d, 0x40, 0x0d, 0x03, 0x0d, 0xa9, 0x1c, 0x11, 0xa9, 0x4f, 0x07, 0x01, 0x07, 0x00, + 0x18, 0xa9, 0x01, 0x00, 0x2f, 0x0e, 0x3f, 0x0e, 0x4f, 0x0e, 0x03, 0x0e, 0xa9, 0x1b, 0x0f, 0x92, + 0x18, 0x01, 0x48, 0x0e, 0x08, 0x09, 0x48, 0x0d, 0x08, 0x0c, 0x92, 0x1a, 0x48, 0x08, 0x02, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xec, 0x5d, 0xd6, 0xd5, 0xed, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xec, 0x5d, 0xd6, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x33, 0x3e, 0x03, 0x35, 0x35, 0x21, 0x11, 0x33, + 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x13, 0x14, 0x0e, 0x04, 0x07, 0x33, 0x11, 0x0f, 0x24, 0x1a, + 0x1d, 0x0d, 0x02, 0x01, 0x46, 0x23, 0x72, 0xef, 0x72, 0xda, 0x03, 0x06, 0x09, 0x10, 0x15, 0x0e, + 0x9f, 0x66, 0x2d, 0x75, 0x7d, 0x7a, 0x30, 0x3c, 0xfd, 0xfb, 0xfe, 0xf5, 0xa5, 0xa5, 0x02, 0xaa, + 0x14, 0x3f, 0x4c, 0x54, 0x4f, 0x45, 0x18, 0x01, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x2d, 0x00, 0x64, 0x40, 0x3a, 0x1d, 0x1c, 0x08, 0x07, + 0x85, 0x06, 0x11, 0x17, 0x0d, 0x0e, 0x04, 0x16, 0x24, 0x00, 0x2a, 0x1e, 0x1f, 0x05, 0x06, 0x06, + 0x2d, 0x25, 0x2e, 0x16, 0x06, 0x25, 0x25, 0x06, 0x16, 0x03, 0x2f, 0x2e, 0x24, 0x08, 0x05, 0x08, + 0x11, 0x2a, 0x1c, 0x1f, 0x1f, 0x1c, 0x2a, 0x11, 0x08, 0x05, 0x06, 0x07, 0x1d, 0x08, 0x17, 0x08, + 0x0d, 0x02, 0x07, 0x02, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x3f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x12, + 0x39, 0x11, 0x17, 0x39, 0x12, 0x17, 0x39, 0x10, 0xed, 0x32, 0x32, 0x32, 0x31, 0x30, 0x13, 0x1e, + 0x03, 0x17, 0x35, 0x33, 0x15, 0x3e, 0x03, 0x37, 0x33, 0x06, 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, + 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x0e, 0x03, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x27, + 0x70, 0x0a, 0x14, 0x17, 0x18, 0x0d, 0x60, 0x0d, 0x18, 0x17, 0x15, 0x09, 0x67, 0x19, 0x3e, 0x2d, + 0x15, 0x29, 0x23, 0x1b, 0x08, 0x67, 0x06, 0x14, 0x19, 0x1b, 0x0c, 0x60, 0x0d, 0x1b, 0x18, 0x14, + 0x06, 0x67, 0x08, 0x1b, 0x23, 0x29, 0x15, 0x2a, 0x41, 0x19, 0x02, 0x6b, 0x26, 0x41, 0x3b, 0x39, + 0x1e, 0xf9, 0xfa, 0x1d, 0x39, 0x3c, 0x42, 0x26, 0x47, 0x8e, 0x4f, 0x1d, 0x4a, 0x55, 0x5d, 0x2e, + 0x2a, 0x53, 0x4e, 0x44, 0x1b, 0xfe, 0xd6, 0x01, 0x2a, 0x1b, 0x44, 0x4e, 0x53, 0x2a, 0x2e, 0x5d, + 0x55, 0x4a, 0x1d, 0x51, 0x8e, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0xff, 0xf3, 0x01, 0xdf, + 0x02, 0x79, 0x00, 0x32, 0x00, 0xa3, 0xb9, 0x00, 0x32, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x00, + 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x25, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x24, + 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0d, 0x00, 0x4d, 0x17, 0x20, 0x0e, 0x00, 0x4d, 0x0c, 0x40, 0x0c, + 0x0d, 0x00, 0x4c, 0x0b, 0x20, 0x0d, 0x00, 0x4d, 0x0b, 0x40, 0x0c, 0x00, 0x4d, 0x0a, 0x20, 0x0d, + 0x0f, 0x00, 0x4c, 0x32, 0x2e, 0x46, 0x1b, 0x04, 0x46, 0x15, 0x00, 0x1b, 0x20, 0x1b, 0x40, 0x1b, + 0x60, 0x1b, 0x04, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x23, 0x11, 0x15, 0x48, 0x1b, 0x34, 0x0d, 0x23, + 0x33, 0x24, 0x3f, 0x29, 0x01, 0x29, 0x4a, 0x20, 0x01, 0x48, 0x40, 0x31, 0x01, 0x31, 0x18, 0x18, + 0x31, 0x10, 0x20, 0x09, 0x0c, 0x30, 0x07, 0x01, 0x07, 0x4a, 0x10, 0x03, 0x00, 0x3f, 0xfd, 0x5d, + 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x5d, 0xed, 0x10, 0xfd, 0x5d, 0xc6, 0x01, + 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x2b, 0x5d, 0xd4, 0xed, 0x10, 0xfd, 0xc6, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x03, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x80, 0x4f, 0x3c, 0x3c, 0x32, 0x33, 0x13, 0x27, 0x24, 0x20, + 0x0b, 0x2c, 0x27, 0x64, 0x33, 0x39, 0x52, 0x35, 0x19, 0x2c, 0x27, 0x33, 0x3b, 0x16, 0x3a, 0x63, + 0x4d, 0x30, 0x6b, 0x2d, 0x29, 0x0c, 0x22, 0x29, 0x2f, 0x1a, 0x26, 0x32, 0x1e, 0x0c, 0x39, 0x47, + 0x62, 0x01, 0x73, 0x2b, 0x26, 0x26, 0x23, 0x08, 0x0c, 0x0f, 0x07, 0x63, 0x18, 0x1b, 0x1d, 0x30, + 0x3d, 0x1f, 0x2a, 0x49, 0x13, 0x11, 0x54, 0x34, 0x22, 0x44, 0x36, 0x22, 0x19, 0x17, 0x63, 0x05, + 0x0e, 0x0c, 0x09, 0x0f, 0x18, 0x20, 0x11, 0x2a, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x3c, 0x40, 0x11, 0x0e, 0x20, 0x0d, 0x00, + 0x4d, 0x0c, 0x44, 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x0a, 0x11, 0x03, 0x44, 0x01, 0xb8, 0xff, 0xc0, + 0x40, 0x10, 0x0b, 0x0e, 0x48, 0x01, 0x10, 0x0c, 0x03, 0x08, 0x0f, 0x08, 0x0b, 0x08, 0x08, 0x02, + 0x02, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, + 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x03, 0x37, 0x33, 0x11, 0x23, + 0x11, 0x06, 0x06, 0x07, 0x2e, 0x6f, 0x10, 0x2d, 0x35, 0x38, 0x1c, 0x63, 0x6f, 0x39, 0x61, 0x2c, + 0x02, 0x6b, 0xfe, 0x83, 0x23, 0x5f, 0x68, 0x67, 0x2c, 0xfd, 0x95, 0x01, 0x9b, 0x67, 0xc8, 0x6c, + 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x38, 0x02, 0x26, 0x02, 0xcb, 0x00, 0x00, + 0x01, 0x07, 0x03, 0x90, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x15, 0x1d, + 0x00, 0x09, 0x50, 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0xff, 0xf3, 0x01, 0xd0, 0x02, 0x6b, 0x00, 0x14, 0x00, 0x29, 0x40, 0x16, 0x09, 0x44, 0x0c, 0x30, + 0x0d, 0x01, 0x0d, 0x44, 0x08, 0x00, 0x15, 0x00, 0x14, 0x09, 0x0b, 0x08, 0x09, 0x02, 0x0d, 0x48, + 0x08, 0x02, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0x5d, 0xd6, + 0xed, 0x31, 0x30, 0x37, 0x3e, 0x03, 0x37, 0x36, 0x36, 0x35, 0x21, 0x11, 0x23, 0x11, 0x23, 0x0e, + 0x05, 0x07, 0x08, 0x1a, 0x23, 0x16, 0x0f, 0x06, 0x10, 0x0a, 0x01, 0x46, 0x7b, 0x5a, 0x02, 0x06, + 0x0f, 0x1c, 0x31, 0x4a, 0x36, 0x5d, 0x09, 0x19, 0x21, 0x29, 0x19, 0x42, 0xc7, 0x80, 0xfd, 0x95, + 0x02, 0x05, 0x3a, 0x7a, 0x72, 0x67, 0x4f, 0x32, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, + 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x07, 0x00, 0x34, 0x40, 0x10, 0x01, 0x44, 0x20, 0x02, + 0x30, 0x02, 0x02, 0x02, 0x05, 0x44, 0x70, 0x06, 0xd0, 0x06, 0x02, 0x06, 0xb8, 0xff, 0xc0, 0x40, + 0x0d, 0x0b, 0x0e, 0x48, 0x06, 0x08, 0x04, 0x48, 0x07, 0x02, 0x06, 0x08, 0x02, 0x08, 0x00, 0x3f, + 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x11, + 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0xc7, 0x7b, 0xa4, 0x7b, 0x02, 0x6b, 0xfd, 0x95, 0x02, + 0x05, 0xfd, 0xfb, 0x02, 0x6b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x72, 0x02, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, + 0x02, 0x79, 0x02, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, + 0x02, 0x6b, 0x00, 0x20, 0x00, 0x45, 0x40, 0x27, 0x19, 0x40, 0x12, 0x00, 0x4d, 0x18, 0x40, 0x12, + 0x00, 0x4d, 0x14, 0x21, 0x05, 0x22, 0x1b, 0x1b, 0x21, 0x22, 0x20, 0x00, 0x22, 0x40, 0x22, 0x60, + 0x22, 0x02, 0x18, 0x17, 0x0d, 0x21, 0x18, 0x02, 0x0e, 0x11, 0x48, 0x0a, 0x09, 0x00, 0x02, 0x00, + 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xc5, 0x5d, 0x10, 0xd6, 0xc5, 0x11, 0x12, + 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x0e, + 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, 0x27, 0x33, + 0x16, 0x16, 0x17, 0x3e, 0x03, 0x37, 0x01, 0xee, 0x18, 0x27, 0x23, 0x21, 0x13, 0x17, 0x2d, 0x31, + 0x38, 0x21, 0x1e, 0x35, 0x1d, 0x19, 0x16, 0x24, 0x10, 0x20, 0x2c, 0x15, 0x46, 0x70, 0x23, 0x88, + 0x1d, 0x3d, 0x26, 0x0e, 0x1a, 0x15, 0x10, 0x06, 0x02, 0x6b, 0x4b, 0x75, 0x64, 0x5a, 0x2f, 0x3b, + 0x4e, 0x2e, 0x14, 0x0c, 0x0b, 0x68, 0x08, 0x08, 0x2c, 0x38, 0x75, 0xdb, 0x55, 0x46, 0x8a, 0x4e, + 0x2c, 0x54, 0x4a, 0x3e, 0x16, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, + 0x02, 0x93, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x7f, 0x40, 0x0b, 0x1a, 0x20, 0x16, 0x00, + 0x4d, 0x1a, 0x20, 0x14, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xe0, 0xb3, 0x11, 0x00, 0x4d, 0x13, 0xb8, + 0xff, 0xe0, 0xb3, 0x16, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xe0, 0x40, 0x39, 0x14, 0x00, 0x4d, 0x10, + 0x20, 0x11, 0x00, 0x4d, 0x15, 0x84, 0x40, 0x07, 0x50, 0x07, 0x80, 0x07, 0x90, 0x07, 0x04, 0x07, + 0x1d, 0x18, 0x05, 0x09, 0x52, 0x11, 0x02, 0x40, 0x0c, 0x50, 0x0c, 0x90, 0x0c, 0x03, 0x0c, 0x1c, + 0x0e, 0x84, 0xaf, 0x00, 0x01, 0x00, 0x1c, 0x11, 0x19, 0x73, 0x0c, 0x09, 0x0a, 0x08, 0x12, 0x18, + 0x73, 0x02, 0x05, 0x03, 0x93, 0x00, 0x3f, 0xd5, 0x32, 0xed, 0x32, 0x3f, 0xd5, 0x32, 0xed, 0x32, + 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0x32, 0x32, 0xed, 0x32, 0x32, 0x10, 0xd6, 0x5d, + 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x34, 0x37, 0x35, 0x33, 0x15, 0x16, + 0x15, 0x14, 0x07, 0x15, 0x23, 0x35, 0x26, 0x37, 0x14, 0x16, 0x17, 0x11, 0x06, 0x06, 0x17, 0x34, + 0x26, 0x27, 0x11, 0x36, 0x36, 0x19, 0xb1, 0x60, 0xb0, 0xb0, 0x60, 0xb1, 0x62, 0x21, 0x2e, 0x2d, + 0x22, 0xfd, 0x21, 0x2d, 0x2c, 0x22, 0x01, 0x4c, 0xeb, 0x1b, 0x41, 0x41, 0x1d, 0xe9, 0xeb, 0x1a, + 0x47, 0x46, 0x1b, 0xea, 0x40, 0x5d, 0x10, 0x01, 0x5b, 0x11, 0x5c, 0x3d, 0x40, 0x5a, 0x10, 0xfe, + 0xa6, 0x11, 0x5e, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x5f, 0x40, 0x29, 0x02, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x02, 0x38, 0x0c, 0x00, 0x4d, 0x02, + 0x40, 0x0b, 0x00, 0x4d, 0x01, 0x40, 0x09, 0x0e, 0x00, 0x4c, 0x01, 0x00, 0x44, 0x20, 0x09, 0x30, + 0x09, 0x40, 0x09, 0x03, 0x09, 0x07, 0x44, 0x90, 0x06, 0xc0, 0x06, 0x02, 0x06, 0xb8, 0xff, 0xc0, + 0x40, 0x16, 0x0b, 0x10, 0x48, 0x06, 0x6f, 0x04, 0x9f, 0x04, 0x02, 0x04, 0x0c, 0x0a, 0x02, 0x07, + 0x02, 0x00, 0x09, 0x48, 0x04, 0x08, 0x02, 0x92, 0x00, 0x3f, 0x3f, 0xed, 0x32, 0x3f, 0x3f, 0x01, + 0x10, 0xc4, 0x5d, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x2b, 0x25, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0xb6, 0x23, + 0x72, 0xfe, 0xc6, 0x7b, 0x92, 0x7c, 0x66, 0xfe, 0xf5, 0xa5, 0x02, 0x6b, 0xfd, 0xfb, 0x02, 0x05, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x46, 0x40, 0x16, + 0x0d, 0xbf, 0x0a, 0x01, 0x0a, 0x44, 0x10, 0x08, 0x20, 0x08, 0x30, 0x08, 0x03, 0x08, 0x00, 0x44, + 0x70, 0x15, 0xd0, 0x15, 0x02, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x0e, 0x48, 0x15, 0x18, + 0x17, 0x02, 0x05, 0x4a, 0x40, 0x10, 0x01, 0x10, 0x10, 0x09, 0x0c, 0x08, 0x09, 0x02, 0x00, 0x3f, + 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0x5d, 0xed, + 0x5d, 0x33, 0x31, 0x30, 0x13, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, + 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0xa8, 0x0b, 0x18, 0x24, 0x18, 0x0d, + 0x27, 0x11, 0x7b, 0x7b, 0x17, 0x2c, 0x14, 0x2c, 0x49, 0x35, 0x1e, 0x7b, 0x01, 0xb5, 0x26, 0x30, + 0x1d, 0x0b, 0x03, 0x04, 0x01, 0x2d, 0xfd, 0x95, 0xcf, 0x03, 0x04, 0x14, 0x34, 0x59, 0x45, 0xbd, + 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x39, 0x40, 0x21, + 0x6f, 0x0b, 0x01, 0x0b, 0x0a, 0x10, 0x07, 0x01, 0x4f, 0x07, 0x5f, 0x07, 0x02, 0x07, 0x06, 0x6f, + 0x03, 0x01, 0x03, 0x02, 0x0c, 0x0a, 0x02, 0x03, 0x02, 0x08, 0x06, 0x05, 0x48, 0x01, 0x08, 0x00, + 0x08, 0x00, 0x3f, 0x3f, 0xfd, 0xc5, 0x33, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0xd6, 0xd5, + 0x5d, 0x71, 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, + 0x33, 0x11, 0x33, 0x01, 0xdd, 0xfe, 0x3a, 0x61, 0x52, 0x60, 0x52, 0x61, 0x02, 0x6b, 0xfd, 0xfb, + 0x01, 0x1a, 0xfe, 0xe6, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0xff, 0x5b, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x59, 0x40, 0x3a, 0x2f, 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x03, 0x00, + 0x0f, 0x03, 0x0c, 0x9f, 0x0b, 0xaf, 0x0b, 0x02, 0x10, 0x0b, 0x01, 0xcf, 0x0b, 0x01, 0x70, 0x0b, + 0x01, 0x0b, 0x09, 0x6f, 0x06, 0x01, 0x06, 0x10, 0x05, 0x20, 0x05, 0x30, 0x05, 0x03, 0xd0, 0x05, + 0xe0, 0x05, 0x02, 0x05, 0x10, 0x0d, 0x02, 0x06, 0x02, 0x0f, 0x0a, 0x08, 0x0b, 0x48, 0x03, 0x08, + 0x02, 0x92, 0x00, 0x3f, 0x3f, 0xfd, 0x32, 0xc5, 0x33, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x71, + 0xd5, 0x5d, 0xd6, 0xd5, 0x5d, 0x5d, 0x71, 0x71, 0xd6, 0xd5, 0xd5, 0xc5, 0x5d, 0x31, 0x30, 0x25, + 0x11, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, + 0xeb, 0x60, 0xfe, 0x8c, 0x61, 0x47, 0x61, 0x47, 0x60, 0x66, 0xfe, 0xf5, 0xa5, 0x02, 0x6b, 0xfd, + 0xfb, 0x01, 0x1a, 0xfe, 0xe6, 0x02, 0x05, 0xfd, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, + 0xff, 0xf8, 0x01, 0xd4, 0x02, 0x6b, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x37, 0x40, 0x1f, 0x1a, 0x46, + 0x40, 0x09, 0x60, 0x09, 0x02, 0x09, 0x1f, 0x13, 0x03, 0x44, 0x9f, 0x12, 0x01, 0x12, 0x00, 0x1e, + 0x04, 0x4a, 0x1d, 0x1d, 0x01, 0x17, 0x4a, 0x0e, 0x09, 0x00, 0x48, 0x01, 0x02, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0x5d, + 0xed, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x11, 0x17, 0x15, 0x16, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x12, + 0xcb, 0x1d, 0x31, 0x50, 0x39, 0x20, 0x22, 0x3b, 0x50, 0x2e, 0x22, 0x4f, 0x26, 0x7b, 0x07, 0x0e, + 0x06, 0x2b, 0x32, 0x33, 0x30, 0x02, 0x05, 0x66, 0xd6, 0x17, 0x31, 0x4c, 0x36, 0x36, 0x50, 0x34, + 0x19, 0x08, 0x0b, 0x01, 0xfa, 0xd6, 0xc7, 0x01, 0x2e, 0x36, 0x37, 0x2d, 0x00, 0x03, 0x00, 0x22, + 0xff, 0xf8, 0x01, 0xcf, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x6a, 0xb9, 0x00, + 0x16, 0xff, 0xc0, 0x40, 0x2c, 0x0b, 0x0e, 0x48, 0x16, 0x84, 0x00, 0x2f, 0x1b, 0x3f, 0x1b, 0x02, + 0x1b, 0x52, 0x1a, 0x40, 0x09, 0x10, 0x48, 0x1a, 0x1f, 0x0f, 0x40, 0x0a, 0x50, 0x0a, 0xd0, 0x0a, + 0x03, 0x31, 0x0a, 0x01, 0x20, 0x0a, 0x01, 0x0a, 0x52, 0xc0, 0x09, 0xd0, 0x09, 0xf0, 0x09, 0x03, + 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0f, 0x12, 0x48, 0x09, 0x1e, 0x1c, 0x02, 0x1b, 0x08, 0x0c, + 0x4a, 0x19, 0x19, 0x05, 0x0a, 0x02, 0x13, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, + 0x2f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x5d, 0x5d, 0x32, 0x10, 0xde, + 0x2b, 0xfd, 0x5d, 0xde, 0xed, 0x2b, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x11, 0x33, 0x15, 0x33, 0x32, 0x16, 0x27, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x01, 0x23, 0x11, 0x33, 0x01, 0x4c, 0x1b, 0x2f, 0x40, 0x24, 0x1d, 0x3d, 0x22, 0x60, 0x0d, + 0x61, 0x5c, 0xca, 0x07, 0x13, 0x06, 0x26, 0x22, 0x2d, 0x2d, 0x01, 0x3f, 0x60, 0x60, 0xcb, 0x3c, + 0x50, 0x32, 0x15, 0x07, 0x0a, 0x02, 0x62, 0xce, 0x66, 0x01, 0xd8, 0x01, 0x01, 0x3b, 0x32, 0x3b, + 0x32, 0xfe, 0xc8, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x18, 0x00, 0x3f, 0xb2, 0x15, 0x46, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x21, 0x09, 0x0f, 0x48, 0x00, 0x1a, 0x0c, 0x09, 0x44, 0x10, 0x07, 0x20, 0x07, 0x30, 0x07, 0x50, + 0x07, 0x04, 0x07, 0x19, 0x4f, 0x18, 0x01, 0x18, 0x4a, 0x0a, 0x0a, 0x03, 0x08, 0x02, 0x10, 0x4a, + 0x03, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xed, + 0x32, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, + 0x15, 0x33, 0x32, 0x05, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x01, + 0xd5, 0x85, 0x74, 0x25, 0x54, 0x2d, 0x7b, 0x31, 0xf3, 0xfe, 0xdc, 0x08, 0x1a, 0x0f, 0x18, 0x2a, + 0x1f, 0x13, 0x49, 0x38, 0xcb, 0x69, 0x6a, 0x08, 0x0b, 0x02, 0x60, 0xd6, 0x66, 0xc7, 0x01, 0x0a, + 0x17, 0x24, 0x1b, 0x39, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xe4, + 0x02, 0x79, 0x00, 0x24, 0x00, 0x39, 0x40, 0x1e, 0x0c, 0x0a, 0x0d, 0x46, 0x00, 0x20, 0x20, 0x20, + 0x02, 0x20, 0x26, 0x16, 0x03, 0x25, 0x15, 0x12, 0x4a, 0x1b, 0x0c, 0x0b, 0x0c, 0x0b, 0x00, 0x1b, + 0x03, 0x04, 0x07, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0x32, 0xc5, 0x31, 0x30, 0x17, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x23, 0x35, 0x33, 0x2e, 0x03, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0xd1, 0x3a, + 0x53, 0x1a, 0x1f, 0x12, 0x40, 0x30, 0x47, 0x4e, 0x08, 0xce, 0xcd, 0x06, 0x1d, 0x28, 0x2f, 0x19, + 0x2a, 0x41, 0x17, 0x20, 0x07, 0x1c, 0x2a, 0x37, 0x20, 0x3d, 0x63, 0x47, 0x27, 0x25, 0x47, 0x66, + 0x0d, 0x1b, 0x10, 0x61, 0x0b, 0x16, 0x5c, 0x49, 0x6f, 0x30, 0x3c, 0x23, 0x0d, 0x15, 0x0f, 0x62, + 0x04, 0x10, 0x0e, 0x0b, 0x29, 0x51, 0x79, 0x50, 0x4a, 0x77, 0x54, 0x2e, 0x00, 0x02, 0x00, 0x1e, + 0xff, 0xf3, 0x01, 0xdb, 0x02, 0x79, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x65, 0xb7, 0xc0, 0x00, 0xd0, + 0x00, 0xf0, 0x00, 0x03, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0b, 0x0e, 0x48, 0x00, 0x52, 0x25, + 0xc0, 0x1b, 0xd0, 0x1b, 0xf0, 0x1b, 0x03, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x0e, 0x48, + 0x1b, 0x52, 0x0a, 0x11, 0x0b, 0x20, 0x10, 0x30, 0x10, 0x02, 0x10, 0x52, 0x0e, 0xb8, 0xff, 0xc0, + 0x40, 0x14, 0x11, 0x1a, 0x48, 0x0e, 0x2f, 0x2a, 0x4a, 0x16, 0x03, 0x0b, 0x48, 0x10, 0x0f, 0x02, + 0x0c, 0x08, 0x20, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xd5, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0x32, 0xd6, 0x32, 0xfd, 0x2b, 0x5d, 0xd6, 0xed, 0x2b, 0x5d, 0x31, + 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, + 0x33, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x01, 0xdb, 0x10, 0x23, 0x36, 0x26, 0x23, 0x34, 0x23, + 0x13, 0x02, 0x3e, 0x61, 0x61, 0x3f, 0x03, 0x14, 0x24, 0x32, 0x21, 0x25, 0x36, 0x23, 0x11, 0xbb, + 0x02, 0x09, 0x11, 0x10, 0x10, 0x12, 0x09, 0x02, 0x02, 0x09, 0x12, 0x10, 0x10, 0x12, 0x08, 0x02, + 0x01, 0x36, 0x60, 0x7d, 0x49, 0x1d, 0x19, 0x41, 0x6e, 0x54, 0xfe, 0xf1, 0x02, 0x6b, 0xf6, 0x4c, + 0x65, 0x3b, 0x18, 0x1d, 0x49, 0x7d, 0x60, 0x3e, 0x55, 0x34, 0x16, 0x17, 0x34, 0x54, 0x3e, 0x3f, + 0x54, 0x34, 0x16, 0x16, 0x34, 0x55, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x72, 0x00, 0x19, 0x00, 0x24, 0x00, 0x3a, 0x40, 0x20, 0x1e, 0x08, 0x44, 0x00, 0x06, 0x10, + 0x06, 0x02, 0x06, 0x26, 0x1a, 0x46, 0x15, 0x09, 0x0c, 0x44, 0x12, 0x0d, 0x25, 0x0c, 0x08, 0x08, + 0x48, 0x1e, 0x1e, 0x00, 0x07, 0x08, 0x22, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, + 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x32, 0xed, 0x32, 0xd6, 0xed, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, + 0x31, 0x30, 0x01, 0x32, 0x1e, 0x02, 0x17, 0x11, 0x23, 0x35, 0x23, 0x06, 0x06, 0x07, 0x23, 0x3e, + 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x07, 0x14, 0x16, 0x33, 0x33, 0x35, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x01, 0x27, 0x0f, 0x28, 0x2c, 0x2b, 0x12, 0x7b, 0x40, 0x23, 0x3d, 0x17, 0x81, + 0x0c, 0x21, 0x24, 0x25, 0x11, 0x33, 0x2b, 0x21, 0x3e, 0x56, 0x38, 0x38, 0x3f, 0x1b, 0x0a, 0x14, + 0x07, 0x31, 0x3c, 0x02, 0x72, 0x02, 0x03, 0x07, 0x04, 0xfd, 0x9e, 0xe4, 0x39, 0x6f, 0x3c, 0x1f, + 0x45, 0x45, 0x3f, 0x1a, 0x17, 0x58, 0x36, 0x34, 0x4d, 0x32, 0x18, 0xca, 0x2d, 0x31, 0xba, 0x02, + 0x01, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x01, 0xe2, 0x02, 0x06, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcd, 0x02, 0xb5, 0x00, 0x1c, + 0x00, 0x2e, 0x00, 0x60, 0xb9, 0x00, 0x18, 0xff, 0xe0, 0x40, 0x1a, 0x0d, 0x00, 0x4d, 0x04, 0x20, + 0x12, 0x00, 0x4d, 0x04, 0x20, 0x0e, 0x00, 0x4d, 0x03, 0x20, 0x0e, 0x00, 0x4d, 0x05, 0x20, 0x18, + 0x00, 0x4d, 0x2a, 0x53, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x09, 0x0c, 0x48, 0x0c, 0x00, 0x00, + 0x01, 0x00, 0x30, 0x20, 0x53, 0x14, 0x2f, 0x00, 0x1c, 0x9f, 0x25, 0x57, 0x11, 0x07, 0x2d, 0x57, + 0x30, 0x07, 0x50, 0x07, 0x70, 0x07, 0x03, 0x07, 0x0a, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, + 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xc6, 0x5d, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, + 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x36, 0x36, 0x37, 0x01, 0x06, 0x06, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, 0x01, 0xc6, 0x2c, 0x5b, + 0x4e, 0x37, 0x07, 0x33, 0x32, 0x26, 0x42, 0x31, 0x1c, 0x21, 0x37, 0x4b, 0x2a, 0x74, 0x64, 0x24, + 0x46, 0x6a, 0x45, 0x1e, 0x39, 0x1f, 0xfe, 0xfa, 0x02, 0x01, 0x06, 0x12, 0x21, 0x1a, 0x11, 0x1a, + 0x12, 0x09, 0x25, 0x27, 0x22, 0x02, 0x47, 0x09, 0x08, 0x19, 0x39, 0x3a, 0x1c, 0x1d, 0x39, 0x55, + 0x38, 0x3c, 0x5a, 0x3c, 0x1e, 0x96, 0x94, 0x61, 0x86, 0x5a, 0x34, 0x0f, 0x06, 0x07, 0x07, 0xfe, + 0x89, 0x0b, 0x1f, 0x12, 0x1a, 0x39, 0x2f, 0x1e, 0x15, 0x22, 0x2d, 0x17, 0x35, 0x45, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x44, 0xff, 0xf7, 0x01, 0xce, 0x01, 0xe0, 0x00, 0x09, 0x00, 0x14, 0x00, 0x2f, + 0x00, 0x8f, 0x40, 0x15, 0x0d, 0x40, 0x0e, 0x00, 0x4d, 0x0d, 0x40, 0x0b, 0x00, 0x4d, 0x06, 0x40, + 0x0e, 0x00, 0x4d, 0x06, 0x40, 0x0b, 0x00, 0x4d, 0x2a, 0xb8, 0xff, 0xe0, 0xb3, 0x0f, 0x00, 0x4d, + 0x2a, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x29, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0e, 0x0f, + 0x00, 0x4c, 0x10, 0x40, 0x0d, 0x00, 0x4d, 0x0d, 0x53, 0x25, 0x06, 0x53, 0x2d, 0xb8, 0xff, 0xc0, + 0x40, 0x28, 0x09, 0x0c, 0x48, 0x2d, 0x31, 0x14, 0x09, 0x51, 0x00, 0x1a, 0x10, 0x1a, 0x30, 0x1a, + 0x03, 0x1a, 0x30, 0x70, 0x08, 0x80, 0x08, 0x02, 0x08, 0x73, 0x0a, 0x28, 0x0a, 0x28, 0x15, 0x10, + 0x55, 0x20, 0x0b, 0x3f, 0x03, 0x01, 0x03, 0x55, 0x15, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0xed, + 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x10, + 0xd6, 0x2b, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, + 0x2b, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x37, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x13, 0x22, 0x2e, 0x02, 0x27, 0x11, 0x3e, 0x03, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x03, 0x07, 0x06, 0x06, 0xbf, 0x0a, 0x2c, 0x0f, 0x26, + 0x2a, 0x4b, 0x4a, 0x48, 0x1a, 0x21, 0x26, 0x1f, 0x0b, 0x29, 0x0a, 0x3a, 0x17, 0x32, 0x31, 0x2b, + 0x10, 0x10, 0x2b, 0x31, 0x32, 0x17, 0x33, 0x4a, 0x2f, 0x16, 0x20, 0x17, 0x0c, 0x1b, 0x15, 0x0e, + 0x01, 0x02, 0x68, 0x60, 0x02, 0x01, 0x17, 0x1e, 0x35, 0x54, 0x14, 0x1c, 0x1b, 0x15, 0x03, 0x02, + 0x5b, 0xfe, 0xdc, 0x04, 0x06, 0x08, 0x04, 0x01, 0xc2, 0x03, 0x07, 0x04, 0x03, 0x15, 0x23, 0x2f, + 0x1b, 0x23, 0x30, 0x0c, 0x06, 0x13, 0x1c, 0x26, 0x19, 0x41, 0x53, 0x00, 0x00, 0x01, 0x00, 0x59, + 0x00, 0x00, 0x01, 0xbf, 0x01, 0xd6, 0x00, 0x05, 0x00, 0x28, 0x40, 0x18, 0x20, 0x00, 0x01, 0x00, + 0x01, 0x51, 0x00, 0x03, 0x10, 0x03, 0x30, 0x03, 0x03, 0x03, 0x06, 0x30, 0x01, 0x01, 0x01, 0x55, + 0x04, 0x0a, 0x03, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x5d, + 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x21, 0x01, 0xbf, 0xea, 0x7c, 0x01, 0x66, 0x01, 0x70, + 0xfe, 0x90, 0x01, 0xd6, 0x00, 0x02, 0x00, 0x18, 0xff, 0x7a, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x0f, + 0x00, 0x17, 0x00, 0x5d, 0xb9, 0x00, 0x14, 0xff, 0xc0, 0x40, 0x09, 0x0e, 0x00, 0x4d, 0x0c, 0x0a, + 0x19, 0x16, 0x51, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x29, 0x09, 0x0e, 0x48, 0x08, 0x09, 0x19, 0x2f, + 0x15, 0x3f, 0x15, 0x02, 0x15, 0x01, 0x0d, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x03, 0x06, 0x00, + 0x18, 0x01, 0x15, 0x55, 0x0e, 0x0d, 0x06, 0x0b, 0x08, 0x55, 0x0c, 0x06, 0x07, 0x0a, 0x10, 0x55, + 0x06, 0x0a, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0xc5, 0x3f, 0xc5, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xc6, 0x5d, 0xc5, 0xd5, 0xc5, 0x5d, 0x10, 0xd6, 0xd5, 0x2b, 0xed, 0x10, 0xd6, 0xc5, 0x31, 0x30, + 0x2b, 0x37, 0x33, 0x3e, 0x03, 0x35, 0x21, 0x11, 0x33, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x13, + 0x0e, 0x03, 0x07, 0x33, 0x11, 0x18, 0x25, 0x16, 0x1d, 0x0f, 0x06, 0x01, 0x31, 0x23, 0x72, 0xdd, + 0x72, 0xd2, 0x03, 0x08, 0x0e, 0x15, 0x0f, 0x8d, 0x66, 0x24, 0x5c, 0x62, 0x63, 0x2b, 0xfe, 0x90, + 0xec, 0x86, 0x86, 0x01, 0xf6, 0x1f, 0x45, 0x46, 0x43, 0x1d, 0x01, 0x0a, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x01, 0xe2, 0x02, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, + 0x00, 0x00, 0x01, 0xe6, 0x01, 0xd6, 0x00, 0x2b, 0x00, 0x73, 0x40, 0x41, 0x12, 0x40, 0x00, 0x50, + 0x00, 0x80, 0x00, 0x90, 0x00, 0x04, 0x00, 0x52, 0x29, 0x15, 0x29, 0x18, 0x24, 0x19, 0x03, 0x23, + 0x1e, 0x0e, 0x05, 0x0f, 0x03, 0x0b, 0x06, 0x23, 0x29, 0x06, 0x1e, 0x0b, 0x06, 0x0b, 0x29, 0x1e, + 0x23, 0x05, 0x2c, 0x2d, 0x12, 0x15, 0x14, 0x1e, 0x00, 0x29, 0x0b, 0x2b, 0x1e, 0x0b, 0x1e, 0x0b, + 0x14, 0x2b, 0x0a, 0x24, 0x0a, 0x18, 0x06, 0x14, 0x06, 0x0f, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12, + 0x39, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x17, + 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x10, 0xed, 0x5d, 0x32, 0x31, 0x30, 0x01, 0x3e, 0x03, + 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x17, 0x23, 0x26, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, + 0x06, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x2e, 0x03, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x35, 0x33, 0x01, + 0x2b, 0x09, 0x17, 0x17, 0x15, 0x08, 0x67, 0x0c, 0x1a, 0x1d, 0x21, 0x13, 0x23, 0x3c, 0x16, 0x67, + 0x07, 0x2a, 0x21, 0x60, 0x22, 0x28, 0x08, 0x67, 0x0a, 0x19, 0x1e, 0x22, 0x11, 0x14, 0x22, 0x1d, + 0x19, 0x0c, 0x67, 0x08, 0x15, 0x18, 0x17, 0x0a, 0x60, 0x01, 0x11, 0x14, 0x32, 0x34, 0x34, 0x17, + 0x1c, 0x33, 0x35, 0x37, 0x1f, 0x35, 0x86, 0x41, 0x20, 0x6f, 0x4e, 0xdd, 0xe0, 0x4d, 0x6e, 0x25, + 0x1f, 0x43, 0x42, 0x3d, 0x1a, 0x21, 0x37, 0x34, 0x33, 0x1c, 0x17, 0x34, 0x34, 0x31, 0x14, 0xc4, + 0x00, 0x01, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xb3, 0x01, 0xe0, 0x00, 0x30, 0x00, 0x51, 0x40, 0x2f, + 0x28, 0x53, 0x08, 0x1d, 0x53, 0x0e, 0x32, 0x24, 0x00, 0x10, 0x16, 0x01, 0x16, 0x31, 0x17, 0x40, + 0x1a, 0x01, 0x1a, 0x57, 0x13, 0x3f, 0x25, 0x4f, 0x25, 0x7f, 0x25, 0x8f, 0x25, 0x04, 0x25, 0x73, + 0x22, 0x0b, 0x0b, 0x22, 0x03, 0x13, 0x07, 0x30, 0x4f, 0x2d, 0x01, 0x2d, 0x57, 0x03, 0x0b, 0x00, + 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x10, 0xfd, + 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0xc4, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x13, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x40, 0x22, 0x4e, 0x33, + 0x27, 0x46, 0x35, 0x20, 0x22, 0x1d, 0x27, 0x26, 0x21, 0x37, 0x4a, 0x29, 0x32, 0x5f, 0x24, 0x17, + 0x14, 0x53, 0x35, 0x2c, 0x2d, 0x0e, 0x17, 0x1d, 0x0f, 0x6a, 0x6a, 0x26, 0x1d, 0x07, 0x12, 0x1e, + 0x16, 0x2a, 0x4b, 0x17, 0x01, 0xc7, 0x0b, 0x0e, 0x0d, 0x1f, 0x34, 0x26, 0x23, 0x30, 0x11, 0x11, + 0x37, 0x2b, 0x28, 0x37, 0x22, 0x0f, 0x12, 0x0f, 0x65, 0x07, 0x13, 0x19, 0x15, 0x0f, 0x13, 0x0b, + 0x04, 0x5d, 0x1b, 0x11, 0x08, 0x11, 0x0d, 0x08, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x0f, 0x00, 0x3c, 0x40, 0x10, 0x0a, 0x07, 0x52, 0x06, + 0x03, 0x20, 0x0f, 0x30, 0x0f, 0x02, 0x0f, 0x52, 0x70, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x10, 0x09, 0x0e, 0x48, 0x00, 0x10, 0x0a, 0x03, 0x01, 0x0f, 0x06, 0x08, 0x06, 0x07, 0x0a, 0x01, + 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0x5d, + 0xd5, 0xd5, 0xed, 0xc5, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x36, 0x36, 0x37, 0x33, 0x11, 0x23, + 0x11, 0x0e, 0x03, 0x07, 0x3f, 0x6e, 0x20, 0x4e, 0x38, 0x63, 0x6f, 0x17, 0x29, 0x27, 0x29, 0x16, + 0x01, 0xd6, 0xfe, 0xf5, 0x40, 0x81, 0x4a, 0xfe, 0x2a, 0x01, 0x20, 0x23, 0x42, 0x44, 0x4b, 0x2c, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, 0x02, 0xae, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, + 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x15, 0x1d, 0x00, 0x07, + 0x50, 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe8, + 0x01, 0xd6, 0x00, 0x18, 0x00, 0x5a, 0x40, 0x0d, 0x03, 0x51, 0x04, 0x0f, 0x51, 0x80, 0x0e, 0xa0, + 0x0e, 0xb0, 0x0e, 0x03, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0a, 0x0f, 0x48, 0x0e, 0x1a, 0x09, + 0x52, 0x00, 0x30, 0x14, 0x01, 0x14, 0x51, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x0f, 0x48, + 0x16, 0x19, 0x17, 0x0a, 0x16, 0x06, 0x00, 0x03, 0x14, 0x0f, 0x09, 0x09, 0x03, 0x0f, 0x06, 0x03, + 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x18, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0xd0, 0xed, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0xd6, 0xed, 0x31, 0x30, + 0x13, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, + 0x23, 0x11, 0x33, 0xbb, 0x23, 0x49, 0x19, 0x95, 0x12, 0x2c, 0x2f, 0x2f, 0x14, 0x19, 0x39, 0x36, + 0x2d, 0x0e, 0x8e, 0x0c, 0x26, 0x2c, 0x2e, 0x13, 0x7c, 0x7c, 0x01, 0x21, 0x2a, 0x62, 0x29, 0x17, + 0x38, 0x3a, 0x36, 0x16, 0x18, 0x41, 0x46, 0x46, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x01, + 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0xff, 0xf8, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x15, + 0x00, 0x21, 0x40, 0x11, 0x20, 0x13, 0x01, 0x13, 0x51, 0x15, 0x00, 0x53, 0x10, 0x08, 0x16, 0x14, + 0x06, 0x12, 0x0a, 0x07, 0x07, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0xd6, 0xed, + 0x5d, 0x31, 0x30, 0x13, 0x0e, 0x05, 0x07, 0x27, 0x36, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x35, 0x21, + 0x11, 0x23, 0x11, 0xf0, 0x02, 0x05, 0x0d, 0x1a, 0x2d, 0x43, 0x30, 0x11, 0x23, 0x22, 0x0b, 0x0c, + 0x0d, 0x07, 0x01, 0x01, 0x34, 0x7b, 0x01, 0x70, 0x2b, 0x57, 0x52, 0x48, 0x37, 0x22, 0x03, 0x66, + 0x08, 0x22, 0x15, 0x18, 0x3f, 0x46, 0x47, 0x1f, 0x36, 0xfe, 0x2a, 0x01, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x01, 0xde, 0x01, 0xd6, 0x00, 0x1c, 0x00, 0x87, 0xb9, 0x00, + 0x0d, 0xff, 0xf8, 0xb4, 0x0e, 0x0f, 0x00, 0x4c, 0x04, 0xb8, 0xff, 0xc0, 0x40, 0x45, 0x0b, 0x00, + 0x4d, 0x13, 0x40, 0x0b, 0x00, 0x4d, 0x0a, 0x0b, 0x20, 0x10, 0xc0, 0x10, 0xd0, 0x10, 0x03, 0x10, + 0x1e, 0x15, 0x1d, 0x14, 0x16, 0x13, 0x05, 0x12, 0x11, 0x1e, 0x20, 0x16, 0x30, 0x16, 0x02, 0x3f, + 0x11, 0x01, 0x16, 0x11, 0x05, 0x11, 0x05, 0x16, 0x03, 0x1d, 0x1e, 0x00, 0x1c, 0x17, 0x1d, 0x16, + 0x06, 0x12, 0x15, 0x05, 0x13, 0x14, 0x14, 0x13, 0x05, 0x15, 0x12, 0x05, 0x0a, 0x11, 0x06, 0x0a, + 0x0a, 0x00, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x3f, + 0x01, 0x10, 0xd6, 0xd5, 0xc5, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x5d, 0x5d, + 0x11, 0x12, 0x39, 0x11, 0x39, 0x12, 0x39, 0x11, 0x39, 0x10, 0xd6, 0x5d, 0xd5, 0xc5, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, + 0x23, 0x13, 0x07, 0x23, 0x27, 0x13, 0x23, 0x3e, 0x03, 0x37, 0xa2, 0x07, 0x15, 0x18, 0x19, 0x0b, + 0x0b, 0x19, 0x18, 0x15, 0x08, 0x66, 0x07, 0x0d, 0x09, 0x06, 0x02, 0x71, 0x06, 0x4b, 0x5a, 0x4a, + 0x05, 0x71, 0x03, 0x07, 0x08, 0x0b, 0x07, 0x01, 0xd6, 0x15, 0x3c, 0x45, 0x48, 0x22, 0x21, 0x48, + 0x45, 0x3d, 0x15, 0x3e, 0x75, 0x73, 0x73, 0x3d, 0x01, 0x4c, 0xeb, 0xeb, 0xfe, 0xb4, 0x3a, 0x7c, + 0x7b, 0x74, 0x31, 0x00, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x00, 0x01, 0xb8, 0x01, 0xd6, 0x00, 0x0b, + 0x00, 0x39, 0x40, 0x0e, 0x09, 0x00, 0x51, 0x0f, 0x02, 0x01, 0x9f, 0x02, 0x01, 0x02, 0x08, 0x03, + 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x0e, 0x48, 0x05, 0x0c, 0x02, 0x55, 0x09, 0x0a, + 0x0a, 0x06, 0x0a, 0x04, 0x06, 0x01, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xd5, 0xed, 0x01, 0x10, + 0xd6, 0x2b, 0xfd, 0x32, 0xd6, 0x5d, 0x71, 0xed, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, 0x23, 0x15, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x01, 0xb8, 0x7b, 0x87, 0x7b, 0x7b, 0x87, 0x7b, 0xba, + 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x01, 0xe2, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, + 0x01, 0xd6, 0x00, 0x07, 0x00, 0x42, 0x40, 0x17, 0xbf, 0x01, 0x01, 0x01, 0x51, 0xb0, 0x02, 0x01, + 0x9f, 0x02, 0xaf, 0x02, 0x02, 0x30, 0x02, 0x01, 0x02, 0xbf, 0x05, 0x01, 0x05, 0x51, 0x06, 0xb8, + 0xff, 0xc0, 0x40, 0x10, 0x09, 0x0e, 0x48, 0x06, 0x08, 0x06, 0x06, 0x01, 0x06, 0x30, 0x03, 0x01, + 0x03, 0x55, 0x00, 0x0a, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x5d, + 0xd6, 0x5d, 0x5d, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, + 0x01, 0xb6, 0x7c, 0x80, 0x7b, 0x01, 0xd6, 0xfe, 0x2a, 0x01, 0x70, 0xfe, 0x90, 0x01, 0xd6, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x02, 0x06, 0x00, 0x53, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, 0x01, 0xe2, 0x02, 0x06, 0x00, 0x46, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x00, 0x01, 0xcf, 0x01, 0xd6, 0x00, 0x07, 0x00, 0x2b, 0x40, 0x19, + 0x00, 0x20, 0x01, 0x01, 0x01, 0x51, 0x04, 0x40, 0x05, 0x50, 0x05, 0x80, 0x05, 0x03, 0x05, 0x08, + 0x04, 0x01, 0x55, 0x07, 0x0a, 0x06, 0x0a, 0x03, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xc0, 0x01, + 0x10, 0xd6, 0x5d, 0xd5, 0xfd, 0x5d, 0xc5, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, + 0x21, 0x01, 0xcf, 0x97, 0x7c, 0x96, 0x01, 0xa9, 0x01, 0x70, 0xfe, 0x90, 0x01, 0x70, 0x66, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x01, 0xd6, 0x02, 0x06, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x18, 0xff, 0x5b, 0x01, 0xdb, 0x02, 0xb5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x27, + 0x00, 0x74, 0x40, 0x2f, 0x27, 0x1d, 0x0d, 0x20, 0x22, 0x30, 0x22, 0x40, 0x22, 0xc0, 0x22, 0xd0, + 0x22, 0x05, 0x22, 0x52, 0xa0, 0x0a, 0x01, 0x0a, 0x3f, 0x0d, 0x4f, 0x0d, 0x02, 0x0d, 0x85, 0x1a, + 0x10, 0xa0, 0x00, 0x01, 0x00, 0x20, 0x03, 0x30, 0x03, 0x40, 0x03, 0xc0, 0x03, 0xd0, 0x03, 0x05, + 0x03, 0x52, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x15, 0x18, 0x48, 0xaf, 0x15, 0x01, 0x15, 0x28, + 0x07, 0x49, 0x27, 0x06, 0x1c, 0x0d, 0x49, 0x1d, 0x0a, 0x1b, 0x00, 0x49, 0x1a, 0x0a, 0x06, 0x49, + 0x10, 0x06, 0x0f, 0x0e, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0xc5, 0x3f, 0xed, 0xc5, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xfd, 0x5d, 0xd6, 0x5d, 0xc0, 0xc0, 0xfd, 0x5d, 0xd6, 0x5d, 0xed, + 0x5d, 0x10, 0xd0, 0xc0, 0x31, 0x30, 0x13, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x33, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x11, 0x23, 0x35, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x35, 0x37, + 0x15, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x07, 0xc9, 0x2a, 0x25, 0x24, 0x2b, 0x60, 0x24, 0x2c, + 0x2c, 0x24, 0x60, 0x2f, 0x43, 0x2b, 0x14, 0x13, 0x2a, 0x43, 0x31, 0x60, 0x26, 0x41, 0x30, 0x1b, + 0x1a, 0x30, 0x41, 0x27, 0x01, 0x78, 0x05, 0x4f, 0x3d, 0x3d, 0x4c, 0x06, 0x01, 0x4a, 0x45, 0x46, + 0x48, 0x02, 0xfd, 0xe3, 0xa3, 0x04, 0x27, 0x3d, 0x53, 0x30, 0x2d, 0x4e, 0x3e, 0x28, 0x07, 0xcf, + 0x15, 0xe4, 0x05, 0x1f, 0x39, 0x54, 0x38, 0x39, 0x54, 0x39, 0x20, 0x04, 0xff, 0xff, 0x00, 0x14, + 0x00, 0x00, 0x01, 0xe1, 0x01, 0xd6, 0x02, 0x06, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x7a, 0x01, 0xc7, 0x01, 0xd6, 0x00, 0x0b, 0x00, 0x35, 0x40, 0x20, 0x01, 0x00, 0x51, 0x04, + 0x09, 0x08, 0x51, 0x20, 0x05, 0x30, 0x05, 0x50, 0x05, 0x60, 0x05, 0x70, 0x05, 0x05, 0x05, 0x0c, + 0x0a, 0x0a, 0x06, 0x0a, 0x00, 0x09, 0x55, 0x05, 0x06, 0x03, 0x04, 0x06, 0x00, 0x3f, 0xc5, 0x3f, + 0xfd, 0xc0, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xd6, 0xcd, 0xfd, 0xcd, 0x31, 0x30, 0x25, + 0x33, 0x15, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0xa4, 0x23, 0x72, 0xfe, + 0xea, 0x7b, 0x6e, 0x7c, 0x66, 0xec, 0x86, 0x01, 0xd6, 0xfe, 0x90, 0x01, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2b, 0x00, 0x00, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x16, 0x00, 0x2c, 0x40, 0x17, + 0x0e, 0x0a, 0x51, 0x0b, 0x18, 0x01, 0x53, 0x30, 0x15, 0x01, 0x15, 0x17, 0x16, 0x0a, 0x06, 0x57, + 0x10, 0x10, 0x0a, 0x0d, 0x06, 0x0a, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0xfd, 0xc0, 0x31, 0x30, 0x13, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x37, 0x35, 0x33, 0x11, 0x23, 0x35, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0xa6, + 0x10, 0x1b, 0x21, 0x11, 0x10, 0x1c, 0x0b, 0x7c, 0x7c, 0x2a, 0x27, 0x27, 0x45, 0x34, 0x1e, 0x01, + 0xd6, 0x95, 0x13, 0x18, 0x0e, 0x05, 0x02, 0x02, 0xcf, 0xfe, 0x2a, 0x9a, 0x06, 0x0f, 0x27, 0x41, + 0x32, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x01, 0xd4, 0x01, 0xd6, 0x00, 0x0b, + 0x00, 0x53, 0x40, 0x1a, 0x5f, 0x00, 0x6f, 0x00, 0x02, 0x00, 0x09, 0x70, 0x08, 0x01, 0x2f, 0x08, + 0x3f, 0x08, 0x4f, 0x08, 0x03, 0x08, 0x05, 0x5f, 0x04, 0x6f, 0x04, 0x02, 0x04, 0x01, 0xb8, 0xff, + 0xc0, 0x40, 0x1a, 0x1a, 0x00, 0x4d, 0x70, 0x01, 0x80, 0x01, 0x90, 0x01, 0xc0, 0x01, 0x04, 0x01, + 0x0c, 0x0a, 0x0a, 0x03, 0x0a, 0x01, 0x06, 0x07, 0x05, 0x09, 0x55, 0x00, 0x06, 0x00, 0x3f, 0xfd, + 0xd0, 0xc5, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xd5, 0x5d, 0xd6, 0xd5, 0x5d, 0x5d, + 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x11, + 0x33, 0x01, 0xd4, 0xfe, 0x4c, 0x61, 0x49, 0x60, 0x49, 0x61, 0x01, 0xd6, 0xfe, 0x90, 0xff, 0xff, + 0x01, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0xff, 0x7a, 0x01, 0xe2, 0x01, 0xd6, 0x00, 0x0f, + 0x00, 0x7f, 0xb5, 0x0d, 0x40, 0x0e, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0d, 0x00, + 0x4c, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x49, 0x0b, 0x0d, 0x00, 0x4c, 0x0d, 0x2f, 0x0c, 0x3f, 0x0c, + 0x4f, 0x0c, 0x6f, 0x0c, 0x04, 0x0c, 0x5f, 0x00, 0x01, 0x00, 0x09, 0x10, 0x07, 0x01, 0xef, 0x07, + 0xff, 0x07, 0x02, 0x70, 0x07, 0x80, 0x07, 0x90, 0x07, 0x03, 0x5f, 0x07, 0x01, 0x07, 0x06, 0x6f, + 0x03, 0x01, 0x03, 0x10, 0x02, 0x20, 0x02, 0x30, 0x02, 0x03, 0x70, 0x02, 0x80, 0x02, 0x90, 0x02, + 0x03, 0x02, 0x10, 0x07, 0x0a, 0x0a, 0x03, 0x0a, 0x05, 0x08, 0x55, 0x0f, 0x0c, 0x55, 0x00, 0x06, + 0x00, 0x3f, 0xed, 0xc5, 0xfd, 0xc0, 0x3f, 0x3f, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xd5, 0x5d, + 0xd6, 0xd5, 0x5d, 0x5d, 0x5d, 0x71, 0xd6, 0xc5, 0x5d, 0xd5, 0x5d, 0xc5, 0x31, 0x30, 0x2b, 0x2b, + 0x2b, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, + 0x23, 0x01, 0x82, 0xfe, 0x9e, 0x61, 0x3e, 0x61, 0x3e, 0x61, 0x23, 0x60, 0x01, 0xd6, 0xfe, 0x90, + 0xff, 0xff, 0x01, 0x70, 0xfe, 0x90, 0xec, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xd4, + 0x01, 0xd6, 0x00, 0x0c, 0x00, 0x20, 0x00, 0x4b, 0x40, 0x31, 0x00, 0x40, 0x0b, 0x00, 0x4d, 0x00, + 0x53, 0x00, 0x14, 0x20, 0x14, 0x40, 0x14, 0x60, 0x14, 0x80, 0x14, 0x05, 0x14, 0x22, 0x06, 0x0d, + 0x51, 0x1d, 0x1e, 0x21, 0x03, 0x57, 0x0f, 0x0f, 0x19, 0x4f, 0x1e, 0x5f, 0x1e, 0x6f, 0x1e, 0x03, + 0x1e, 0x55, 0x1f, 0x0a, 0x40, 0x0a, 0x01, 0x0a, 0x57, 0x19, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, + 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, + 0x31, 0x30, 0x2b, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x27, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, + 0x35, 0x33, 0x01, 0x59, 0x2b, 0x24, 0x0c, 0x17, 0x0a, 0x0c, 0x1a, 0x0c, 0x1d, 0x2d, 0x7c, 0x28, + 0x21, 0x25, 0x40, 0x2e, 0x1b, 0x1f, 0x34, 0x48, 0x28, 0x37, 0x56, 0x22, 0x50, 0xcb, 0x98, 0x21, + 0x18, 0x03, 0x02, 0x6c, 0x02, 0x02, 0x18, 0xbb, 0x08, 0x13, 0x29, 0x3d, 0x2a, 0x2f, 0x3d, 0x24, + 0x0e, 0x0f, 0x08, 0x01, 0x63, 0x66, 0x00, 0x00, 0x00, 0x03, 0x00, 0x22, 0xff, 0xf6, 0x01, 0xcf, + 0x01, 0xd6, 0x00, 0x12, 0x00, 0x16, 0x00, 0x23, 0x00, 0x5d, 0x40, 0x0a, 0x20, 0x17, 0x30, 0x17, + 0x40, 0x17, 0x03, 0x17, 0x79, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x0c, 0x48, 0x08, 0x60, + 0x16, 0x70, 0x16, 0x02, 0x16, 0xa4, 0x40, 0x15, 0x01, 0x15, 0x25, 0x00, 0x1e, 0xa4, 0x10, 0xb8, + 0xff, 0xc0, 0x40, 0x17, 0x0f, 0x12, 0x48, 0x10, 0x24, 0x16, 0x06, 0x13, 0x0a, 0x40, 0x03, 0x01, + 0x03, 0x57, 0x1a, 0x1a, 0x0d, 0x12, 0x0a, 0x21, 0x57, 0x0d, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x12, + 0x39, 0x2f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xfd, + 0x5d, 0xd6, 0x2b, 0xed, 0x5d, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x3b, 0x02, 0x11, 0x23, 0x27, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x82, 0x14, 0x1e, 0x10, 0x19, 0x2f, 0x25, 0x16, + 0x1b, 0x2d, 0x3b, 0x1f, 0x24, 0x3e, 0x21, 0x60, 0xed, 0x60, 0x60, 0x8a, 0x1b, 0x20, 0x0b, 0x12, + 0x0b, 0x0c, 0x11, 0x0b, 0x21, 0x1a, 0x01, 0x2f, 0x04, 0x04, 0x13, 0x27, 0x3e, 0x2b, 0x30, 0x3d, + 0x24, 0x0d, 0x0b, 0x08, 0x01, 0xcd, 0xfe, 0x2a, 0x98, 0x1f, 0x23, 0x03, 0x02, 0x7e, 0x02, 0x02, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0xf6, 0x01, 0xd5, 0x01, 0xd6, 0x00, 0x10, + 0x00, 0x21, 0x00, 0x3f, 0xb2, 0x03, 0x53, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x09, 0x0f, 0x48, + 0x19, 0x23, 0x11, 0x0b, 0x51, 0x70, 0x1f, 0x01, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, 0x0e, + 0x48, 0x1f, 0x22, 0x14, 0x57, 0x08, 0x08, 0x1c, 0x21, 0x0a, 0x00, 0x57, 0x1c, 0x07, 0x00, 0x3f, + 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xc0, 0x10, 0xd6, 0x2b, + 0xed, 0x31, 0x30, 0x25, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x15, 0x1e, + 0x03, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x33, 0x01, 0x09, 0x26, 0x2b, 0x11, 0x1d, 0x24, 0x12, 0x14, 0x25, 0x0c, 0x05, 0x15, 0x1a, 0x1a, + 0x4e, 0x16, 0x2f, 0x17, 0x27, 0x48, 0x38, 0x21, 0x6c, 0x5a, 0x3c, 0x6a, 0x33, 0x7b, 0x5c, 0x1d, + 0x1f, 0x12, 0x16, 0x0d, 0x05, 0x04, 0x02, 0x6c, 0x01, 0x01, 0x01, 0x01, 0xd3, 0x04, 0x05, 0x11, + 0x26, 0x3f, 0x2e, 0x53, 0x4b, 0x0c, 0x0c, 0x01, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0xff, 0xf5, 0x01, 0xcb, 0x01, 0xe2, 0x00, 0x22, 0x00, 0x4a, 0x40, 0x2d, 0x11, 0x14, 0x53, 0x00, + 0x00, 0x20, 0x00, 0xb0, 0x00, 0x03, 0x00, 0x24, 0x13, 0x1b, 0x08, 0x23, 0x1a, 0x30, 0x17, 0x01, + 0x17, 0x57, 0x1e, 0x40, 0x13, 0x50, 0x13, 0x60, 0x13, 0x03, 0x13, 0x55, 0x12, 0x12, 0x05, 0x1e, + 0x0b, 0x09, 0x40, 0x0c, 0x01, 0x0c, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, + 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0xd6, 0xc4, 0x10, 0xd6, 0x5d, + 0xfd, 0xc5, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, + 0x32, 0x3e, 0x02, 0x37, 0x23, 0x35, 0x33, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x01, 0xcb, 0x26, 0x43, 0x5e, 0x38, 0x30, 0x54, 0x30, 0x19, 0x1d, 0x42, + 0x23, 0x19, 0x32, 0x2b, 0x1e, 0x06, 0xc3, 0xc2, 0x0e, 0x52, 0x33, 0x25, 0x36, 0x1f, 0x1a, 0x2c, + 0x52, 0x26, 0x39, 0x5f, 0x44, 0x26, 0xee, 0x3c, 0x5d, 0x3f, 0x21, 0x0d, 0x11, 0x65, 0x09, 0x0f, + 0x0a, 0x17, 0x23, 0x1a, 0x5d, 0x32, 0x2a, 0x09, 0x0b, 0x64, 0x0e, 0x0d, 0x21, 0x3f, 0x5b, 0x00, + 0x00, 0x02, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe2, 0x01, 0xe2, 0x00, 0x16, 0x00, 0x2a, 0x00, 0x6d, + 0x40, 0x1a, 0x24, 0x0b, 0x01, 0x3b, 0x1c, 0x4b, 0x1c, 0xcb, 0x1c, 0xdb, 0x1c, 0x04, 0x2f, 0x1c, + 0x01, 0x02, 0x1c, 0x52, 0x40, 0x0b, 0x60, 0x0b, 0x80, 0x0b, 0x03, 0x0b, 0xb8, 0xff, 0xc0, 0x40, + 0x0b, 0x13, 0x16, 0x48, 0x0b, 0x2c, 0xc0, 0x26, 0xd0, 0x26, 0x02, 0x26, 0xb8, 0xff, 0xc0, 0x40, + 0x1d, 0x0b, 0x0f, 0x48, 0x26, 0x52, 0x03, 0x13, 0x02, 0x14, 0x52, 0xd0, 0x16, 0x01, 0x16, 0x2b, + 0x15, 0x06, 0x17, 0x57, 0x10, 0x07, 0x21, 0x57, 0x06, 0x0b, 0x14, 0x02, 0x01, 0x0a, 0x00, 0x3f, + 0xd5, 0xc5, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0xd6, 0xd0, 0xed, + 0x2b, 0x5d, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5f, 0x5d, 0x5d, 0x31, 0x30, 0x5d, 0x13, 0x33, 0x15, + 0x33, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x23, + 0x15, 0x23, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0x17, 0x61, 0x3b, 0x07, 0x46, 0x4b, 0x2a, 0x3a, 0x23, 0x10, 0x10, 0x25, 0x3a, 0x2a, + 0x4a, 0x45, 0x07, 0x3b, 0x61, 0x01, 0x33, 0x0b, 0x14, 0x0f, 0x08, 0x08, 0x0f, 0x14, 0x0b, 0x0b, + 0x14, 0x0f, 0x08, 0x08, 0x0f, 0x14, 0x01, 0xd6, 0xb5, 0x5b, 0x66, 0x22, 0x3f, 0x5b, 0x3a, 0x38, + 0x5b, 0x40, 0x24, 0x6c, 0x5b, 0xbc, 0x5b, 0x0b, 0x20, 0x39, 0x2d, 0x2d, 0x39, 0x1f, 0x0b, 0x0b, + 0x20, 0x38, 0x2d, 0x2e, 0x39, 0x1f, 0x0b, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x01, 0xc7, + 0x01, 0xe0, 0x00, 0x15, 0x00, 0x22, 0x00, 0x40, 0x40, 0x24, 0x22, 0x15, 0x51, 0x00, 0x13, 0x01, + 0x13, 0x24, 0x1c, 0x53, 0x68, 0x0a, 0x01, 0x0a, 0x00, 0x03, 0x51, 0x07, 0x6f, 0x04, 0x01, 0x04, + 0x23, 0x15, 0x55, 0x22, 0x22, 0x0d, 0x14, 0x06, 0x19, 0x57, 0x0d, 0x0b, 0x03, 0x06, 0x00, 0x3f, + 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x32, 0xed, 0x32, 0xd6, 0x5d, + 0xed, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x37, 0x06, 0x06, 0x07, 0x23, 0x36, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x11, 0x23, 0x35, 0x35, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x33, 0xf1, 0x1c, 0x2e, 0x14, 0x7f, 0x1a, 0x39, + 0x19, 0x2c, 0x21, 0x6d, 0x68, 0x18, 0x34, 0x33, 0x2f, 0x11, 0x7b, 0x0a, 0x28, 0x0e, 0x36, 0x28, + 0x10, 0x19, 0x20, 0x10, 0x45, 0xa7, 0x2a, 0x50, 0x2d, 0x3a, 0x66, 0x23, 0x16, 0x3b, 0x29, 0x4e, + 0x55, 0x04, 0x07, 0x09, 0x04, 0xfe, 0x38, 0xa7, 0xcf, 0x01, 0x03, 0x21, 0x1a, 0x11, 0x16, 0x0e, + 0x06, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, + 0xfd, 0x40, 0x09, 0x29, 0x27, 0x00, 0x07, 0x50, 0x02, 0x04, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x03, 0x28, 0x3a, 0x00, + 0x07, 0x50, 0x03, 0x04, 0x32, 0x4f, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x01, 0x00, 0x19, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xb6, 0x00, 0x29, 0x00, 0x69, 0x40, 0x43, + 0x1b, 0x40, 0x0d, 0x0f, 0x00, 0x4c, 0x22, 0x51, 0x13, 0x40, 0x0a, 0x00, 0x4d, 0xa0, 0x13, 0x01, + 0x0f, 0x13, 0x01, 0x13, 0x40, 0x0b, 0x0e, 0x48, 0x13, 0x2b, 0x09, 0x07, 0x07, 0x0b, 0x28, 0x51, + 0x1a, 0x40, 0x0d, 0x00, 0x4d, 0x0f, 0x1a, 0x5f, 0x1a, 0x02, 0x1a, 0x04, 0x00, 0x02, 0x2a, 0x29, + 0x06, 0x1e, 0x57, 0x1a, 0x17, 0x0e, 0x25, 0x57, 0x0e, 0x0b, 0x01, 0x0a, 0x73, 0x06, 0x08, 0x04, + 0x05, 0x03, 0x04, 0x00, 0x3f, 0xc6, 0x3f, 0xc6, 0xfd, 0xc0, 0x3f, 0xed, 0x3f, 0xc5, 0xed, 0x3f, + 0x01, 0x10, 0xd6, 0xde, 0x32, 0xc6, 0x5d, 0x2b, 0xfd, 0xc0, 0x33, 0x2f, 0xc5, 0x10, 0xd6, 0x2b, + 0x5d, 0x5d, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, + 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x50, 0x37, 0x37, 0x7c, 0x7f, 0x7f, 0x0e, 0x26, 0x0f, 0x31, 0x41, 0x27, 0x11, 0x5a, 0x56, 0x0c, + 0x31, 0x16, 0x12, 0x0e, 0x16, 0x11, 0x25, 0x1c, 0x1a, 0x23, 0x0e, 0x1f, 0x08, 0x02, 0x14, 0x53, + 0x3a, 0x15, 0x4f, 0x53, 0x42, 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xf8, 0x5d, 0x59, 0x04, 0x08, + 0x67, 0x04, 0x04, 0x2b, 0x24, 0xe4, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0xff, 0xff, 0x00, 0x59, + 0x00, 0x00, 0x01, 0xbf, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xe6, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, + 0x1d, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x16, 0x08, 0x06, 0x03, 0x00, 0x50, 0x01, 0x04, 0x07, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x27, 0xff, 0xf5, 0x01, 0xd7, 0x01, 0xe2, 0x00, 0x20, + 0x00, 0x50, 0x40, 0x31, 0x08, 0x00, 0x19, 0x20, 0x19, 0x60, 0x19, 0x03, 0x19, 0x22, 0x40, 0x22, + 0x01, 0x12, 0x40, 0x10, 0x01, 0x10, 0x0f, 0x53, 0x00, 0x21, 0x18, 0x40, 0x15, 0x01, 0x15, 0x57, + 0x1c, 0x5f, 0x11, 0x6f, 0x11, 0x02, 0x11, 0x55, 0x10, 0x10, 0x05, 0x1c, 0x07, 0x09, 0x4f, 0x0c, + 0x01, 0x0c, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, + 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xc6, + 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x33, 0x15, 0x23, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x27, 0x20, 0x44, 0x68, 0x47, 0x2b, 0x46, 0x24, 0x1b, 0x14, 0x33, 0x28, 0x48, 0x4c, 0x0b, + 0xc3, 0xc4, 0x0b, 0x51, 0x49, 0x1f, 0x44, 0x1a, 0x10, 0x1a, 0x4d, 0x33, 0x4a, 0x69, 0x43, 0x20, + 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x0c, 0x0e, 0x63, 0x07, 0x0b, 0x32, 0x2a, 0x5d, 0x2d, 0x31, 0x09, + 0x08, 0x65, 0x0a, 0x0d, 0x26, 0x42, 0x5a, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, + 0x01, 0xe2, 0x02, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xac, 0x02, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xa1, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xef, 0x00, 0x00, 0x1a, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xef, 0x40, 0x0d, 0x16, 0x28, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x20, + 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, + 0xff, 0x56, 0x01, 0x90, 0x02, 0xac, 0x02, 0x06, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, + 0xff, 0xf5, 0x01, 0xe1, 0x01, 0xd6, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x50, 0x40, 0x31, 0x29, 0x40, + 0x10, 0x12, 0x00, 0x4c, 0x5f, 0x06, 0x01, 0x06, 0x84, 0x1f, 0x7f, 0x25, 0x8f, 0x25, 0x02, 0x25, + 0x00, 0x8f, 0x10, 0x0f, 0x01, 0x0f, 0x8f, 0x10, 0x01, 0x10, 0x8f, 0x1d, 0x17, 0x2c, 0x03, 0x7d, + 0x22, 0x22, 0x0b, 0x0f, 0x55, 0x1e, 0x0a, 0x17, 0x57, 0x16, 0x07, 0x29, 0x7d, 0x0b, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0x5d, + 0xd6, 0x5d, 0xfd, 0xd0, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x15, 0x14, 0x0e, 0x02, + 0x07, 0x27, 0x3e, 0x03, 0x35, 0x35, 0x33, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x01, 0x2e, 0x0e, 0x1b, 0x0c, 0x3f, 0x3f, 0x19, 0x2a, 0x38, 0x1f, 0x1c, + 0x3a, 0x1b, 0x33, 0x01, 0x18, 0x3c, 0x3c, 0x0e, 0x19, 0x1d, 0x0e, 0x03, 0xe3, 0x51, 0x1a, 0x1b, + 0x07, 0x0d, 0x08, 0x08, 0x0d, 0x06, 0x1d, 0x19, 0x01, 0x26, 0x03, 0x04, 0x54, 0x49, 0x2c, 0x3b, + 0x24, 0x10, 0x0b, 0x09, 0x01, 0x79, 0x18, 0x4f, 0x84, 0x62, 0x3a, 0x05, 0x61, 0x06, 0x19, 0x2d, + 0x43, 0x2f, 0xc1, 0xfe, 0xbd, 0x23, 0x27, 0x02, 0x03, 0x8e, 0x02, 0x01, 0x26, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x2e, 0xff, 0xf5, 0x01, 0xe1, 0x01, 0xd6, 0x00, 0x18, 0x00, 0x25, 0x00, 0x71, + 0x40, 0x33, 0x4f, 0x06, 0x5f, 0x06, 0x02, 0x06, 0x84, 0x19, 0x00, 0x2f, 0x1f, 0x3f, 0x1f, 0x4f, + 0x1f, 0x03, 0x6f, 0x1f, 0x7f, 0x1f, 0x8f, 0x1f, 0x03, 0x1f, 0x8f, 0x16, 0xa0, 0x0f, 0xb0, 0x0f, + 0xc0, 0x0f, 0x03, 0x0f, 0x10, 0x2f, 0x15, 0x3f, 0x15, 0x4f, 0x15, 0x03, 0x8f, 0x15, 0x01, 0x15, + 0x8f, 0x20, 0x13, 0x01, 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x16, 0x0b, 0x10, 0x48, 0x13, 0x26, 0x03, + 0x7d, 0x1c, 0x1c, 0x0b, 0x18, 0x0a, 0x10, 0x15, 0x14, 0x0a, 0x11, 0x06, 0x23, 0x7d, 0x0b, 0x07, + 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xd5, 0xc5, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, + 0x71, 0xfd, 0x5d, 0x71, 0xd0, 0xd6, 0x5d, 0xc0, 0xfd, 0x5d, 0x71, 0xc0, 0xd6, 0xed, 0x5d, 0x31, + 0x30, 0x01, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, + 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0x2e, 0x0e, 0x1b, 0x0c, 0x3f, 0x3f, 0x19, 0x2a, 0x38, + 0x1f, 0x1c, 0x3a, 0x1b, 0x51, 0x57, 0x57, 0x51, 0x58, 0x51, 0x1a, 0x1b, 0x07, 0x0d, 0x08, 0x08, + 0x0d, 0x06, 0x1d, 0x19, 0x01, 0x26, 0x03, 0x04, 0x54, 0x49, 0x2c, 0x3b, 0x24, 0x10, 0x0b, 0x09, + 0xbf, 0xc8, 0x01, 0xd6, 0xba, 0xba, 0xfe, 0xbd, 0x23, 0x27, 0x02, 0x03, 0x8e, 0x02, 0x01, 0x26, + 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb6, 0x02, 0x06, 0x01, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe8, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xed, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfd, 0x40, 0x09, 0x1b, + 0x19, 0x16, 0x0e, 0x50, 0x01, 0x03, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfa, 0x40, 0x09, 0x13, 0x11, 0x00, 0x07, 0x50, + 0x01, 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, + 0x02, 0xae, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x04, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x01, 0x00, 0x3f, 0xff, 0x7a, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x0b, 0x00, 0x48, 0x40, 0x1a, + 0x0a, 0x51, 0x30, 0x09, 0xb0, 0x09, 0xc0, 0x09, 0x03, 0x1f, 0x09, 0x01, 0x09, 0x06, 0x51, 0x05, + 0x4f, 0x00, 0x01, 0x00, 0x1f, 0x03, 0x01, 0x03, 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, + 0x0e, 0x48, 0x05, 0x0c, 0x09, 0x0a, 0x06, 0x0a, 0x08, 0x55, 0x01, 0x03, 0x06, 0x00, 0x06, 0x00, + 0x3f, 0x3f, 0xc5, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0xc5, 0x5d, 0x10, 0xfd, + 0xd6, 0x5d, 0x5d, 0xed, 0x31, 0x30, 0x21, 0x15, 0x23, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, + 0x33, 0x11, 0x01, 0x32, 0x72, 0x81, 0x7b, 0x80, 0x7c, 0x86, 0x86, 0x01, 0xd6, 0xfe, 0x90, 0x01, + 0x70, 0xfe, 0x2a, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xd7, 0x02, 0xb4, 0x00, 0x2c, + 0x00, 0x3c, 0x00, 0x40, 0x40, 0x26, 0x2d, 0x46, 0x13, 0x20, 0x23, 0x40, 0x23, 0x60, 0x23, 0x70, + 0x23, 0x04, 0x23, 0x3e, 0x1b, 0x46, 0x05, 0x08, 0x37, 0x46, 0x70, 0x00, 0x01, 0x00, 0x3d, 0x32, + 0x57, 0x20, 0x20, 0x0d, 0x3a, 0x4a, 0x28, 0x07, 0x16, 0x57, 0x0d, 0x10, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xc5, 0xed, 0x10, 0xd6, 0x5d, + 0xc4, 0xed, 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x32, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, + 0x17, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x2e, 0x02, 0x27, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1f, 0x0b, 0x1e, 0x35, 0x2b, 0x1d, 0x24, 0x14, + 0x29, 0x3f, 0x2c, 0x1a, 0x28, 0x24, 0x21, 0x13, 0x0b, 0x23, 0x52, 0x26, 0x09, 0x13, 0x11, 0x0a, + 0x0b, 0x1b, 0x2d, 0x21, 0x3b, 0x46, 0x1f, 0x39, 0x51, 0x31, 0x32, 0x51, 0x3b, 0x20, 0x01, 0x3a, + 0x11, 0x1b, 0x24, 0x13, 0x1c, 0x23, 0x13, 0x07, 0x35, 0x2a, 0x2a, 0x33, 0xda, 0x16, 0x38, 0x3a, + 0x37, 0x15, 0x17, 0x39, 0x29, 0x1d, 0x33, 0x25, 0x15, 0x01, 0x01, 0x01, 0x5b, 0x02, 0x02, 0x02, + 0x08, 0x10, 0x0d, 0x0c, 0x17, 0x1b, 0x22, 0x16, 0x27, 0x67, 0x48, 0x37, 0x59, 0x3e, 0x21, 0x1f, + 0x3b, 0x56, 0x41, 0x1a, 0x2a, 0x23, 0x1e, 0x0e, 0x0d, 0x24, 0x28, 0x28, 0x12, 0x44, 0x43, 0x42, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x93, 0x00, 0x13, 0x00, 0x20, 0x00, 0x51, + 0x40, 0x31, 0x8f, 0x00, 0x9f, 0x00, 0xbf, 0x00, 0x03, 0x00, 0x53, 0x30, 0x1d, 0x40, 0x1d, 0x02, + 0x1d, 0x14, 0x0f, 0x0d, 0x10, 0x51, 0x0a, 0x07, 0x08, 0x21, 0x40, 0x12, 0x01, 0x12, 0x57, 0x20, + 0x20, 0x0c, 0x03, 0x07, 0x10, 0x40, 0x0d, 0x10, 0x48, 0x10, 0x55, 0x0a, 0x0d, 0x0c, 0x93, 0x18, + 0x57, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xd5, 0xc0, 0xfd, 0x2b, 0xc0, 0x11, 0x12, 0x39, 0x2f, + 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc0, 0xc5, 0xd0, 0xd6, 0x5d, 0xed, 0x5d, 0x31, + 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, + 0x15, 0x23, 0x15, 0x33, 0x32, 0x05, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, + 0x23, 0x01, 0xd5, 0x77, 0x69, 0x23, 0x51, 0x2c, 0x43, 0x43, 0x7b, 0x9c, 0x9c, 0x2b, 0xda, 0xfe, + 0xfb, 0x08, 0x16, 0x0d, 0x13, 0x21, 0x19, 0x0e, 0x3b, 0x2d, 0xcb, 0x69, 0x6a, 0x08, 0x0b, 0x01, + 0xe9, 0x66, 0x39, 0x39, 0x66, 0x5f, 0x66, 0xc7, 0x01, 0x0a, 0x17, 0x24, 0x1b, 0x39, 0x2f, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xd5, 0x02, 0xb6, 0x00, 0x18, 0x00, 0x29, 0x00, 0x50, + 0x40, 0x19, 0x8f, 0x11, 0x9f, 0x11, 0x02, 0x11, 0x53, 0x20, 0x1c, 0x30, 0x1c, 0x40, 0x1c, 0x03, + 0x1c, 0x24, 0x07, 0x05, 0x08, 0x51, 0x02, 0x18, 0x00, 0x2a, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x15, + 0x0d, 0x00, 0x4d, 0x20, 0x0c, 0x01, 0x0c, 0x57, 0x21, 0x21, 0x04, 0x19, 0x57, 0x14, 0x07, 0x06, + 0x0a, 0x04, 0x10, 0x01, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x5d, + 0x2b, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc0, 0xc5, 0xd0, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, + 0x13, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x13, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x06, 0x07, 0x15, 0x1e, 0x03, 0x12, 0x43, 0x7b, 0x95, 0x95, 0x14, 0x28, 0x14, 0x24, 0x41, + 0x32, 0x1e, 0x61, 0x52, 0x39, 0x63, 0x31, 0xc8, 0x1c, 0x21, 0x0e, 0x17, 0x1c, 0x0f, 0x11, 0x1f, + 0x0a, 0x05, 0x13, 0x16, 0x16, 0x01, 0x7a, 0x5c, 0xcb, 0x15, 0xe0, 0x5c, 0x4b, 0x04, 0x05, 0x11, + 0x26, 0x3f, 0x2e, 0x53, 0x4b, 0x0c, 0x0c, 0x01, 0x6c, 0xfe, 0xe2, 0x1d, 0x1f, 0x12, 0x16, 0x0d, + 0x05, 0x04, 0x02, 0x6c, 0x01, 0x01, 0x01, 0x01, 0x00, 0x03, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x02, 0x79, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x34, 0x00, 0x62, 0xb9, 0x00, 0x19, 0xff, 0xc0, 0xb4, + 0x16, 0x17, 0x00, 0x4c, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x34, 0x0e, 0x0f, 0x00, 0x4c, 0x25, 0x1b, + 0x46, 0x40, 0x06, 0x60, 0x06, 0x80, 0x06, 0x03, 0x06, 0x36, 0x30, 0x11, 0x46, 0xa0, 0x00, 0x01, + 0x00, 0x35, 0xa0, 0x19, 0xb0, 0x19, 0x02, 0xa0, 0x28, 0xb0, 0x28, 0x02, 0x14, 0x19, 0x2d, 0x28, + 0x28, 0x2d, 0x19, 0x14, 0x04, 0x03, 0x20, 0x4a, 0x09, 0x07, 0x0c, 0x4a, 0x03, 0x03, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x01, 0x10, 0xd6, 0x5d, + 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x13, 0x22, 0x0e, 0x02, 0x07, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x2e, 0x03, 0x03, 0x32, 0x3e, 0x02, 0x37, 0x06, 0x06, 0x23, + 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x1e, 0x03, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, + 0x6d, 0x73, 0xdf, 0x1c, 0x24, 0x16, 0x0a, 0x01, 0x0e, 0x1c, 0x0e, 0x12, 0x1c, 0x19, 0x18, 0x0e, + 0x0f, 0x0e, 0x01, 0x09, 0x16, 0x25, 0x1c, 0x1a, 0x23, 0x16, 0x0b, 0x02, 0x0a, 0x13, 0x09, 0x12, + 0x1c, 0x19, 0x18, 0x0e, 0x0b, 0x15, 0x0e, 0x01, 0x0b, 0x17, 0x23, 0x01, 0x36, 0xa0, 0xa3, 0xa3, + 0xa0, 0xa0, 0xa3, 0xa3, 0x01, 0x78, 0x1b, 0x2e, 0x3f, 0x25, 0x0e, 0x0b, 0x0d, 0x0f, 0x0d, 0x0a, + 0x26, 0x42, 0x30, 0x1b, 0xfe, 0x50, 0x17, 0x29, 0x38, 0x21, 0x07, 0x05, 0x0d, 0x0f, 0x0d, 0x0a, + 0x0c, 0x23, 0x3b, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x01, 0xe2, 0x00, 0x13, 0x00, 0x23, 0x00, 0x34, 0x00, 0x49, 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0x40, + 0x28, 0x13, 0x00, 0x4d, 0x1c, 0x27, 0x53, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x80, 0x00, 0x04, + 0x00, 0x36, 0x16, 0x2d, 0x53, 0x0a, 0x35, 0x30, 0x24, 0x14, 0x1f, 0x1f, 0x14, 0x24, 0x30, 0x04, + 0x05, 0x2a, 0x57, 0x0f, 0x0b, 0x19, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, + 0x30, 0x00, 0x2b, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x05, 0x22, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x06, 0x06, 0x23, 0x22, + 0x2e, 0x02, 0x37, 0x32, 0x36, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x01, 0xd8, 0x20, 0x3a, 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, + 0x31, 0x51, 0x3b, 0x20, 0xfe, 0xe0, 0x10, 0x0e, 0x03, 0x2e, 0x2e, 0x28, 0x2f, 0x07, 0x0e, 0x1a, + 0x08, 0x0f, 0x1f, 0x1c, 0x1a, 0x74, 0x08, 0x11, 0x09, 0x05, 0x2d, 0x2c, 0x26, 0x30, 0x08, 0x0b, + 0x17, 0x09, 0x0f, 0x1e, 0x1d, 0x1a, 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, 0x42, 0x5b, 0x38, 0x37, + 0x5b, 0x41, 0x23, 0x23, 0x41, 0x5b, 0x46, 0x08, 0x36, 0x41, 0x36, 0x2e, 0x07, 0x06, 0x0c, 0x0f, + 0x0d, 0x22, 0x04, 0x05, 0x33, 0x3c, 0x32, 0x2b, 0x06, 0x06, 0x0c, 0x0f, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 0x0c, 0x02, 0x74, 0x00, 0x23, 0x00, 0x48, 0x40, 0x27, + 0x04, 0x20, 0x0c, 0x00, 0x4d, 0x11, 0x40, 0x0c, 0x00, 0x4d, 0x11, 0x06, 0x16, 0x00, 0x05, 0x0c, + 0x06, 0x05, 0x05, 0x06, 0x0c, 0x03, 0x0b, 0x1c, 0x25, 0x0b, 0x24, 0x1d, 0x1f, 0x4a, 0x19, 0x03, + 0x11, 0x11, 0x05, 0x0c, 0x02, 0x05, 0x08, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x3f, 0xfd, 0xc6, + 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0x12, 0x39, + 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x23, 0x2e, 0x03, 0x27, 0x33, 0x1e, + 0x03, 0x17, 0x3e, 0x03, 0x37, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x01, 0x8b, 0x0b, 0x13, 0x18, 0x20, 0x18, 0x7f, 0x16, 0x30, 0x2b, 0x22, 0x08, 0x82, 0x05, + 0x14, 0x18, 0x1b, 0x0e, 0x0c, 0x14, 0x12, 0x0f, 0x08, 0x10, 0x3c, 0x30, 0x18, 0x2d, 0x23, 0x35, + 0x11, 0x0e, 0x0b, 0x0d, 0x0a, 0x07, 0x01, 0xb1, 0x33, 0x55, 0x5e, 0x76, 0x55, 0x45, 0xae, 0xad, + 0x9a, 0x31, 0x30, 0x7f, 0x87, 0x83, 0x34, 0x37, 0x5e, 0x54, 0x50, 0x2b, 0x52, 0x40, 0x11, 0x1f, + 0x47, 0x11, 0x11, 0x1b, 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, + 0x01, 0xe2, 0x00, 0x20, 0x00, 0x35, 0x40, 0x1b, 0x02, 0x20, 0x0a, 0x00, 0x4d, 0x08, 0x07, 0x0d, + 0x04, 0x12, 0x00, 0x03, 0x04, 0x03, 0x04, 0x03, 0x07, 0x1a, 0x22, 0x07, 0x21, 0x17, 0x0b, 0x07, + 0x0a, 0x04, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x39, 0x39, 0x2f, + 0x2f, 0x11, 0x39, 0x39, 0x12, 0x39, 0x11, 0x39, 0x31, 0x30, 0x2b, 0x01, 0x06, 0x06, 0x07, 0x23, + 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, + 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x01, 0x93, 0x22, 0x41, 0x1d, 0x68, 0x27, 0x51, 0x25, 0x81, + 0x07, 0x14, 0x16, 0x17, 0x0a, 0x0a, 0x10, 0x0e, 0x0e, 0x09, 0x07, 0x14, 0x20, 0x2d, 0x21, 0x14, + 0x2b, 0x18, 0x17, 0x0d, 0x12, 0x08, 0x10, 0x17, 0x01, 0x53, 0x5f, 0xb2, 0x42, 0x59, 0xef, 0x8e, + 0x26, 0x56, 0x57, 0x52, 0x22, 0x22, 0x35, 0x32, 0x33, 0x20, 0x1a, 0x2c, 0x1f, 0x12, 0x07, 0x0b, + 0x61, 0x06, 0x03, 0x10, 0x00, 0x02, 0x00, 0x2e, 0xff, 0x57, 0x01, 0xec, 0x03, 0x39, 0x00, 0x18, + 0x00, 0x2a, 0x00, 0x66, 0xb9, 0x00, 0x09, 0xff, 0xc0, 0x40, 0x3b, 0x0a, 0x00, 0x4d, 0x15, 0xb3, + 0x0a, 0x0b, 0x2c, 0x00, 0x09, 0x01, 0x08, 0x09, 0x08, 0x09, 0x2b, 0x0f, 0x2c, 0x26, 0x1e, 0x18, + 0x2f, 0x02, 0x3f, 0x02, 0x4f, 0x02, 0x03, 0x02, 0xb3, 0x20, 0x01, 0x30, 0x01, 0x50, 0x01, 0x03, + 0x01, 0x2b, 0x25, 0x86, 0x0f, 0x19, 0x01, 0x19, 0x22, 0x1f, 0x86, 0x18, 0x08, 0x14, 0x08, 0x10, + 0x0f, 0x92, 0x08, 0x02, 0x02, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xcd, 0x3f, 0x3f, 0x3f, 0xde, 0xc5, + 0x5d, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0xd6, 0xc4, 0x10, 0xc4, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x5d, 0x10, 0xd6, 0xdd, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x03, + 0x37, 0x33, 0x11, 0x33, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x06, 0x06, + 0x07, 0x13, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, + 0x2e, 0x6f, 0x10, 0x2e, 0x36, 0x39, 0x1c, 0x62, 0x24, 0x3b, 0x3c, 0x49, 0x18, 0x24, 0x0b, 0x19, + 0x39, 0x64, 0x2c, 0x6a, 0x1c, 0x36, 0x2a, 0x1c, 0x03, 0x5c, 0x07, 0x21, 0x17, 0x17, 0x21, 0x07, + 0x5b, 0x03, 0x1b, 0x2a, 0x36, 0x02, 0x6b, 0xfe, 0x83, 0x23, 0x5f, 0x68, 0x67, 0x2c, 0xfe, 0x0b, + 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, 0x3d, 0x1d, 0x01, 0x9b, 0x67, 0xc8, 0x6c, 0x02, 0xa1, 0x11, + 0x21, 0x30, 0x1e, 0x18, 0x22, 0x1c, 0x1a, 0x23, 0x18, 0x1e, 0x2f, 0x21, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x3f, 0xff, 0x6c, 0x01, 0xda, 0x02, 0xae, 0x00, 0x17, 0x00, 0x29, 0x00, 0x69, + 0xb2, 0x12, 0x44, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x09, 0x0d, 0x48, 0x08, 0x09, 0x2b, 0x06, + 0x10, 0x10, 0x2a, 0x0d, 0x2b, 0x25, 0x24, 0x1e, 0x1d, 0x2a, 0x17, 0x02, 0x44, 0xc0, 0x01, 0xd0, + 0x01, 0x02, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x09, 0x0e, 0x48, 0x01, 0x2a, 0x24, 0xa0, 0x18, + 0x21, 0x1e, 0xa0, 0x03, 0x12, 0x07, 0x17, 0x06, 0x0d, 0x0c, 0x09, 0x11, 0x06, 0x07, 0x0a, 0x01, + 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0xd4, 0xc5, 0x3f, 0x12, 0x39, 0x39, 0x3f, 0xde, 0xc5, 0x3f, + 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x32, 0x10, 0xd4, 0xd5, 0xd6, 0xc5, 0x10, 0xc4, 0x12, 0x39, + 0x2f, 0x39, 0x10, 0xd6, 0xd5, 0x2b, 0xed, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x36, 0x36, 0x37, + 0x33, 0x11, 0x33, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x0e, 0x03, 0x07, 0x13, + 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x3f, 0x6e, + 0x20, 0x4e, 0x38, 0x63, 0x24, 0x3c, 0x33, 0x4a, 0x12, 0x22, 0x0b, 0x19, 0x17, 0x29, 0x27, 0x29, + 0x16, 0x59, 0x1c, 0x36, 0x2a, 0x1c, 0x02, 0x5c, 0x06, 0x22, 0x16, 0x17, 0x22, 0x06, 0x5c, 0x03, + 0x1c, 0x2a, 0x36, 0x01, 0xd6, 0xfe, 0xf5, 0x40, 0x81, 0x4a, 0xfe, 0x97, 0x4c, 0x88, 0x2d, 0x2e, + 0x16, 0x37, 0x19, 0x01, 0x20, 0x23, 0x42, 0x44, 0x4b, 0x2c, 0x02, 0x16, 0x11, 0x21, 0x30, 0x1e, + 0x18, 0x23, 0x1c, 0x1b, 0x23, 0x18, 0x1e, 0x30, 0x20, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, + 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x6b, 0x00, 0x14, 0x00, 0x23, 0x00, 0x61, 0x40, 0x20, 0x1e, 0x51, + 0x20, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x03, 0x00, 0x25, 0x15, 0x0f, 0x0d, 0x10, + 0x53, 0x0a, 0x0f, 0x07, 0x01, 0x07, 0x08, 0x24, 0x4f, 0x23, 0x01, 0x23, 0x4a, 0x12, 0xb8, 0xff, + 0xc0, 0x40, 0x19, 0x09, 0x0c, 0x48, 0x12, 0x12, 0x0c, 0x03, 0x07, 0x4f, 0x10, 0x5f, 0x10, 0x6f, + 0x10, 0x03, 0x10, 0x72, 0x0a, 0x0d, 0x0c, 0x02, 0x19, 0x4a, 0x03, 0x09, 0x00, 0x3f, 0xed, 0x3f, + 0xd5, 0xc0, 0xfd, 0x5d, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xd5, + 0x5d, 0x32, 0xfd, 0x32, 0xc5, 0x33, 0x10, 0xd6, 0x5d, 0x71, 0xed, 0x31, 0x30, 0x25, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, + 0x32, 0x16, 0x05, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x01, + 0xd5, 0x85, 0x74, 0x25, 0x42, 0x2e, 0x35, 0x35, 0x7c, 0x47, 0x47, 0x1f, 0x79, 0x7a, 0xfe, 0xee, + 0x08, 0x08, 0x0f, 0x18, 0x2a, 0x1f, 0x13, 0x14, 0x22, 0x2f, 0x1c, 0xc6, 0x68, 0x66, 0x08, 0x0b, + 0x01, 0xc4, 0x62, 0x3a, 0x3a, 0x62, 0x43, 0x61, 0x05, 0xbe, 0x01, 0x08, 0x15, 0x24, 0x1b, 0x1c, + 0x27, 0x16, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xd5, 0x01, 0xe8, 0x00, 0x18, + 0x00, 0x27, 0x00, 0x76, 0x40, 0x3c, 0x1c, 0x51, 0x00, 0x0b, 0x40, 0x0b, 0x60, 0x0b, 0x03, 0x0b, + 0x29, 0x24, 0x18, 0x01, 0x02, 0x51, 0x15, 0x0f, 0x12, 0x1f, 0x12, 0x2f, 0x12, 0x03, 0x0f, 0x12, + 0x01, 0x12, 0x13, 0x28, 0x02, 0x12, 0x40, 0x12, 0x00, 0x4d, 0x6f, 0x12, 0x7f, 0x12, 0x02, 0xaf, + 0x12, 0xbf, 0x12, 0x02, 0x12, 0x18, 0x15, 0x17, 0x4f, 0x21, 0x5f, 0x21, 0x6f, 0x21, 0x03, 0x21, + 0x4a, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0c, 0x0f, 0x48, 0x06, 0x06, 0x0e, 0x17, 0x0b, 0x40, + 0x19, 0x01, 0x19, 0x4a, 0x0e, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0xed, + 0x5d, 0x10, 0xd5, 0x32, 0xc5, 0x5d, 0x71, 0x2b, 0x32, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0x71, 0xc0, + 0xfd, 0xc5, 0xc0, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x15, 0x23, 0x15, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, + 0x33, 0x15, 0x13, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, + 0x01, 0x4e, 0x8b, 0x14, 0x2b, 0x16, 0x25, 0x44, 0x35, 0x1f, 0x65, 0x57, 0x3a, 0x65, 0x33, 0x35, + 0x35, 0x7c, 0x51, 0x21, 0x25, 0x10, 0x19, 0x20, 0x10, 0x12, 0x21, 0x0b, 0x0a, 0x34, 0x01, 0xb3, + 0x53, 0x31, 0x04, 0x05, 0x11, 0x26, 0x3f, 0x2e, 0x53, 0x4b, 0x0c, 0x0c, 0x01, 0x52, 0x53, 0x35, + 0x35, 0xfe, 0xa9, 0x1d, 0x1f, 0x12, 0x16, 0x0d, 0x05, 0x04, 0x02, 0x6c, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x72, 0x00, 0x14, 0x00, 0x24, 0x00, 0x5b, + 0x40, 0x37, 0x07, 0x06, 0x08, 0x20, 0x09, 0x1f, 0x1d, 0x1e, 0x08, 0x25, 0x26, 0x22, 0x46, 0x00, + 0x03, 0x60, 0x03, 0x80, 0x03, 0x03, 0x03, 0x26, 0x0d, 0x20, 0x19, 0x30, 0x19, 0x02, 0x19, 0x44, + 0x10, 0x25, 0x1a, 0x4a, 0x1f, 0x1e, 0x00, 0x0c, 0x08, 0x07, 0x0e, 0x0c, 0x07, 0x0c, 0x07, 0x00, + 0x0e, 0x08, 0x4f, 0x15, 0x01, 0x15, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x12, 0x39, + 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x39, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0x5d, + 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x06, 0x23, 0x23, 0x15, 0x23, 0x11, 0x3e, 0x03, 0x17, 0x22, + 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0x33, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, 0x26, 0xe0, 0x76, + 0x82, 0x23, 0x20, 0x39, 0x53, 0x3c, 0x16, 0x31, 0x1b, 0x2c, 0x7b, 0x12, 0x2d, 0x2e, 0x2c, 0x1f, + 0x0b, 0x27, 0x0b, 0x32, 0x09, 0x13, 0x08, 0x27, 0x52, 0x23, 0x09, 0x3f, 0x02, 0x72, 0x61, 0x6e, + 0x38, 0x50, 0x1a, 0x5f, 0x2e, 0x67, 0x05, 0x05, 0xd1, 0x02, 0x63, 0x04, 0x06, 0x03, 0x02, 0x6b, + 0x01, 0x02, 0xcc, 0x01, 0x43, 0x2f, 0x3c, 0x15, 0x22, 0x37, 0x2a, 0x00, 0x00, 0x02, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x00, 0x13, 0x00, 0x22, 0x00, 0x4d, 0x40, 0x2d, 0x14, 0x53, + 0x40, 0x0e, 0x60, 0x0e, 0x02, 0x0e, 0x24, 0x1f, 0x1e, 0x23, 0x12, 0x11, 0x13, 0x21, 0x00, 0x05, + 0x24, 0x20, 0x20, 0x23, 0x24, 0x05, 0x1a, 0x51, 0x08, 0x23, 0x13, 0x12, 0x11, 0x1f, 0x20, 0x05, + 0x06, 0x17, 0x57, 0x0b, 0x0b, 0x06, 0x0e, 0x1e, 0x57, 0x02, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0xed, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x17, 0x39, + 0x12, 0x39, 0x39, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x05, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, + 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x03, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x27, 0x37, 0x17, 0x36, 0x01, 0x39, 0x0e, 0x10, + 0x17, 0x30, 0x1a, 0x7b, 0x22, 0x63, 0x30, 0x6d, 0x74, 0x23, 0x23, 0x33, 0x53, 0x13, 0x36, 0x33, + 0x0e, 0x20, 0x0b, 0x0b, 0x27, 0x13, 0x2a, 0x52, 0x28, 0x0d, 0x06, 0x03, 0x09, 0x0c, 0xb1, 0x02, + 0x6c, 0x0b, 0x0e, 0x84, 0x71, 0x43, 0x67, 0x20, 0x57, 0x2d, 0x01, 0x4a, 0x3f, 0x51, 0x03, 0x01, + 0xfe, 0xfb, 0x08, 0x0b, 0x4a, 0x2f, 0x46, 0x1e, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0xe1, 0x00, 0x0b, 0x00, 0x30, 0xb7, 0x05, 0x02, 0x06, 0x08, 0x07, 0x44, 0x00, 0x0b, 0xb8, + 0xff, 0xc0, 0x40, 0x0f, 0x0e, 0x12, 0x48, 0x0b, 0x0c, 0x07, 0x00, 0x48, 0x0a, 0x08, 0x06, 0x48, + 0x03, 0x01, 0x02, 0x00, 0x3f, 0xc6, 0xed, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0xd5, 0xfd, + 0xc5, 0xd0, 0xd5, 0xc5, 0x31, 0x30, 0x37, 0x11, 0x33, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, + 0x21, 0x35, 0x7d, 0xec, 0x72, 0xe3, 0x86, 0xfe, 0xa6, 0x66, 0x02, 0x05, 0x76, 0xdc, 0xfe, 0x61, + 0x66, 0x66, 0x00, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x44, 0x00, 0x07, + 0x00, 0x31, 0x40, 0x1f, 0x07, 0x40, 0x05, 0x50, 0x05, 0x02, 0x05, 0xaf, 0x01, 0xbf, 0x01, 0x02, + 0x01, 0x51, 0xa0, 0x03, 0xb0, 0x03, 0xd0, 0x03, 0x03, 0x03, 0x08, 0x06, 0xb1, 0x01, 0x55, 0x04, + 0x0a, 0x02, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0x5d, 0xd5, 0x5d, + 0xc5, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x35, 0x33, 0x01, 0xbf, 0xea, 0x7c, 0xf3, + 0x73, 0x01, 0x70, 0xfe, 0x90, 0x01, 0xd6, 0x6e, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0xe4, + 0x02, 0x6b, 0x00, 0x11, 0x00, 0x42, 0x40, 0x22, 0x07, 0x05, 0x03, 0x0d, 0x0c, 0x0c, 0x0e, 0x0b, + 0x08, 0x09, 0x51, 0x01, 0x00, 0x04, 0x03, 0x11, 0x12, 0x0d, 0x40, 0x00, 0x01, 0x00, 0x48, 0x10, + 0x08, 0x01, 0x0c, 0x48, 0x04, 0x09, 0x08, 0x48, 0x05, 0x02, 0x00, 0x3f, 0xfd, 0xd6, 0x32, 0xed, + 0x32, 0x3f, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xc6, 0xd6, 0xd5, 0x32, 0x32, 0xfd, 0x32, 0xc5, 0x32, + 0x33, 0x11, 0x33, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, + 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x21, 0x35, 0x7d, 0x59, 0x59, 0x01, 0x67, 0xec, + 0x86, 0x86, 0x86, 0xfe, 0xa6, 0x66, 0xa0, 0x62, 0x01, 0x03, 0x66, 0x9d, 0x62, 0xa0, 0x66, 0x66, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xbf, 0x01, 0xd6, 0x00, 0x0d, 0x00, 0x2f, 0x40, 0x18, + 0x00, 0x01, 0x05, 0x03, 0x02, 0x51, 0x08, 0x0b, 0x0a, 0x0e, 0x08, 0x05, 0x73, 0x0b, 0x4f, 0x02, + 0x01, 0x02, 0x00, 0x48, 0x0d, 0x0a, 0x06, 0x08, 0x00, 0x3f, 0x3f, 0xfd, 0xd6, 0x5d, 0x32, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xd5, 0x32, 0xfd, 0xc5, 0x33, 0xd0, 0xc5, 0x31, 0x30, 0x01, 0x23, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, 0x01, 0xbf, 0xea, 0x74, 0x74, + 0x7c, 0x47, 0x47, 0x01, 0x66, 0x01, 0x70, 0x7a, 0x53, 0xa3, 0xa3, 0x53, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0xff, 0x59, 0x01, 0xde, 0x02, 0x6b, 0x00, 0x22, 0x00, 0x4c, 0x40, 0x2f, + 0x19, 0x53, 0x02, 0x00, 0x0c, 0x80, 0x0c, 0x90, 0x0c, 0xa0, 0x0c, 0x04, 0x0c, 0x24, 0x05, 0x21, + 0x51, 0x00, 0x4f, 0x12, 0x01, 0x12, 0x23, 0x40, 0x07, 0x01, 0x07, 0x57, 0x1e, 0x1e, 0x01, 0x22, + 0x08, 0x13, 0x40, 0x16, 0x50, 0x16, 0x02, 0x16, 0x55, 0x0f, 0x92, 0x04, 0x48, 0x01, 0x02, 0x00, + 0x3f, 0xed, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xc6, 0x5d, + 0xd6, 0xed, 0x32, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x31, 0x30, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x11, 0x2d, 0x01, 0x81, 0xfe, 0xfa, + 0x22, 0x22, 0x36, 0x5a, 0x3f, 0x23, 0x7d, 0x81, 0x0e, 0x1e, 0x10, 0x05, 0x0b, 0x13, 0x0a, 0x4d, + 0x4d, 0x14, 0x24, 0x35, 0x21, 0x0d, 0x1a, 0x0e, 0x02, 0x6b, 0x66, 0x7f, 0x06, 0x20, 0x44, 0x6a, + 0x49, 0x87, 0x95, 0x02, 0x02, 0x65, 0x01, 0x4f, 0x61, 0x34, 0x46, 0x2a, 0x11, 0x03, 0x02, 0xfe, + 0xdf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x5a, 0x01, 0xd3, 0x01, 0xd6, 0x00, 0x22, + 0x00, 0x48, 0x40, 0x2c, 0x20, 0x18, 0x30, 0x18, 0xe0, 0x18, 0x03, 0x18, 0x57, 0x09, 0x24, 0x22, + 0x01, 0x1e, 0x51, 0x20, 0x0f, 0x11, 0x01, 0x11, 0x40, 0x0c, 0x0f, 0x48, 0x11, 0x23, 0x1b, 0x57, + 0x04, 0x04, 0x1f, 0x4f, 0x01, 0x01, 0x01, 0x48, 0x21, 0x0a, 0x1f, 0x06, 0x15, 0x57, 0x0e, 0x0e, + 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xc6, 0x2b, 0x5d, + 0xd6, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x23, 0x15, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x23, 0x11, 0x21, 0x01, 0x98, 0xde, 0x25, 0x24, + 0x31, 0x4d, 0x36, 0x1c, 0x17, 0x32, 0x4f, 0x37, 0x0c, 0x1e, 0x0e, 0x08, 0x08, 0x1a, 0x08, 0x35, + 0x2e, 0x36, 0x3d, 0x09, 0x22, 0x09, 0x7b, 0x01, 0x59, 0x01, 0x70, 0x57, 0x06, 0x20, 0x3c, 0x53, + 0x33, 0x33, 0x53, 0x3c, 0x21, 0x01, 0x02, 0x61, 0x01, 0x01, 0x45, 0x38, 0x42, 0x40, 0x03, 0x02, + 0xb6, 0x01, 0xd6, 0x00, 0x00, 0x01, 0x00, 0x09, 0xff, 0x5a, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x2f, + 0x00, 0x72, 0x40, 0x40, 0x18, 0xa4, 0x16, 0x31, 0x14, 0x15, 0x31, 0x2c, 0x00, 0x21, 0x05, 0x06, + 0x19, 0x11, 0x08, 0x1e, 0x04, 0x07, 0x0d, 0x26, 0x00, 0x06, 0x07, 0x0d, 0x0d, 0x07, 0x06, 0x00, + 0x26, 0x05, 0x2f, 0x0e, 0x31, 0x2f, 0x27, 0x30, 0x26, 0x08, 0x20, 0x08, 0x05, 0x08, 0x2c, 0x11, + 0x21, 0x1e, 0x1e, 0x21, 0x11, 0x2c, 0x08, 0x05, 0x06, 0x0d, 0x1f, 0x08, 0x17, 0x0e, 0x0d, 0x02, + 0x06, 0x02, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x39, 0x39, 0x12, 0x39, 0x10, 0xd6, 0xc5, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x13, 0x1e, 0x03, 0x17, 0x35, 0x33, 0x15, 0x3e, 0x03, 0x37, 0x33, 0x06, + 0x06, 0x07, 0x16, 0x16, 0x17, 0x33, 0x11, 0x23, 0x35, 0x23, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, + 0x0e, 0x03, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x27, 0x70, 0x0a, 0x14, 0x17, 0x18, 0x0d, + 0x60, 0x0d, 0x18, 0x17, 0x15, 0x09, 0x67, 0x19, 0x3e, 0x2d, 0x1f, 0x38, 0x14, 0x19, 0x57, 0x10, + 0x06, 0x14, 0x19, 0x1b, 0x0c, 0x60, 0x0d, 0x1b, 0x18, 0x14, 0x06, 0x67, 0x08, 0x1b, 0x23, 0x29, + 0x15, 0x2a, 0x41, 0x19, 0x02, 0x6b, 0x26, 0x41, 0x3b, 0x39, 0x1e, 0xf9, 0xfa, 0x1d, 0x39, 0x3c, + 0x42, 0x26, 0x47, 0x8e, 0x4f, 0x2a, 0x75, 0x42, 0xfe, 0xf4, 0xa6, 0x2a, 0x53, 0x4e, 0x44, 0x1b, + 0xfe, 0xd6, 0x01, 0x2a, 0x1b, 0x44, 0x4e, 0x53, 0x2a, 0x2e, 0x5d, 0x55, 0x4a, 0x1d, 0x51, 0x8e, + 0x45, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0xff, 0x7a, 0x01, 0xeb, 0x01, 0xd6, 0x00, 0x2b, + 0x00, 0x66, 0x40, 0x3b, 0x10, 0x06, 0x0d, 0x2d, 0x1e, 0x1a, 0x17, 0x09, 0x11, 0x15, 0x05, 0x23, + 0x24, 0x1a, 0x17, 0x2a, 0x16, 0x14, 0x2b, 0x15, 0x05, 0x05, 0x15, 0x2b, 0x14, 0x16, 0x2a, 0x17, + 0x1a, 0x24, 0x23, 0x0a, 0x2d, 0x1b, 0x2c, 0x14, 0x17, 0x1e, 0x09, 0x00, 0x29, 0x06, 0x15, 0x2b, + 0x0a, 0x23, 0x0a, 0x1a, 0x06, 0x15, 0x06, 0x0c, 0x48, 0x11, 0x06, 0x0e, 0x88, 0x06, 0x0a, 0x00, + 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xc6, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, + 0x12, 0x39, 0x10, 0xd6, 0xc6, 0xc5, 0x31, 0x30, 0x01, 0x3e, 0x03, 0x37, 0x33, 0x06, 0x06, 0x07, + 0x16, 0x16, 0x17, 0x33, 0x15, 0x23, 0x35, 0x23, 0x26, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, 0x06, + 0x07, 0x23, 0x36, 0x36, 0x37, 0x2e, 0x03, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x35, 0x33, 0x01, 0x2b, + 0x09, 0x17, 0x17, 0x15, 0x08, 0x67, 0x19, 0x38, 0x26, 0x1a, 0x22, 0x11, 0x2f, 0x57, 0x17, 0x07, + 0x2a, 0x21, 0x60, 0x22, 0x28, 0x08, 0x67, 0x14, 0x39, 0x27, 0x15, 0x22, 0x1c, 0x19, 0x0c, 0x67, + 0x08, 0x15, 0x18, 0x17, 0x0a, 0x60, 0x01, 0x11, 0x14, 0x32, 0x34, 0x34, 0x17, 0x38, 0x66, 0x3c, + 0x23, 0x4c, 0x27, 0xec, 0x86, 0x20, 0x6f, 0x4e, 0xdd, 0xe0, 0x4d, 0x6e, 0x25, 0x3e, 0x81, 0x3c, + 0x21, 0x38, 0x33, 0x33, 0x1c, 0x17, 0x34, 0x34, 0x31, 0x14, 0xc4, 0x00, 0x00, 0x01, 0x00, 0x17, + 0xff, 0x56, 0x01, 0xdf, 0x02, 0x79, 0x00, 0x48, 0x00, 0x8d, 0x40, 0x5b, 0x34, 0x40, 0x0f, 0x00, + 0x4d, 0x34, 0x40, 0x0c, 0x00, 0x4d, 0x33, 0x20, 0x0f, 0x00, 0x4d, 0x33, 0x40, 0x0e, 0x00, 0x4d, + 0x33, 0x40, 0x0c, 0x00, 0x4d, 0x32, 0x20, 0x0d, 0x00, 0x4d, 0x40, 0x2c, 0x63, 0xaf, 0x3d, 0x01, + 0x3d, 0x43, 0x27, 0x23, 0x63, 0x60, 0x43, 0x80, 0x43, 0xa0, 0x43, 0x03, 0x43, 0x4a, 0x35, 0x18, + 0x49, 0x03, 0x10, 0x0a, 0x49, 0x34, 0x20, 0x2f, 0x30, 0x2f, 0x02, 0x2f, 0x67, 0x38, 0x40, 0x28, + 0x01, 0x28, 0x65, 0x27, 0x40, 0x40, 0x27, 0x15, 0x38, 0x05, 0x19, 0x2f, 0x1e, 0x3f, 0x1e, 0x02, + 0x1e, 0x67, 0x15, 0x0d, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, + 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0xdc, + 0xc5, 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0xc6, 0x10, 0xd4, 0x5d, 0xed, 0xc5, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x37, 0x26, 0x26, 0x27, 0x37, + 0x1e, 0x03, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x1a, 0x21, 0x1a, 0x15, 0x21, 0x2c, + 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x05, 0x06, 0x2d, 0x60, 0x2a, 0x29, + 0x0c, 0x22, 0x29, 0x2f, 0x1a, 0x26, 0x32, 0x1e, 0x0c, 0x39, 0x47, 0x62, 0x4f, 0x3c, 0x3c, 0x32, + 0x33, 0x13, 0x27, 0x24, 0x20, 0x0b, 0x2c, 0x27, 0x64, 0x33, 0x39, 0x52, 0x35, 0x19, 0x2c, 0x27, + 0x33, 0x3b, 0x12, 0x2b, 0x4a, 0x38, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, + 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x10, 0x0e, 0x02, 0x19, 0x15, 0x63, 0x05, 0x0e, 0x0c, 0x09, + 0x0f, 0x18, 0x20, 0x11, 0x2a, 0x2e, 0x65, 0x2b, 0x26, 0x26, 0x23, 0x08, 0x0c, 0x0f, 0x07, 0x63, + 0x18, 0x1b, 0x1d, 0x30, 0x3d, 0x1f, 0x2a, 0x49, 0x13, 0x11, 0x54, 0x34, 0x1e, 0x3d, 0x33, 0x26, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0xff, 0x56, 0x01, 0xb3, 0x01, 0xe0, 0x00, 0x46, + 0x00, 0x61, 0x40, 0x37, 0x2a, 0x51, 0x3b, 0x3e, 0x1f, 0x51, 0x41, 0x48, 0x0a, 0x10, 0x03, 0x48, + 0x33, 0x26, 0x0f, 0x18, 0x01, 0x18, 0x47, 0x46, 0x07, 0x32, 0x4f, 0x2f, 0x01, 0x2f, 0x4a, 0x36, + 0x24, 0xa5, 0x27, 0x3e, 0x27, 0x3e, 0x15, 0x36, 0x07, 0xa0, 0x19, 0x01, 0x19, 0x40, 0x1c, 0x50, + 0x1c, 0x60, 0x1c, 0x03, 0x1c, 0x4a, 0x15, 0x07, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xfd, + 0x5d, 0xc6, 0x5d, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x10, 0xfd, 0x5d, 0xc6, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xc6, 0x10, 0xd6, 0xd5, 0xcc, 0x10, 0xd6, 0xed, 0xc5, 0xd4, + 0xed, 0x31, 0x30, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, + 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x37, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x10, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, + 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x05, 0x07, 0x29, 0x4b, 0x1e, 0x17, 0x14, 0x53, 0x35, 0x2c, + 0x2d, 0x0e, 0x17, 0x1d, 0x0f, 0x6a, 0x6a, 0x26, 0x1d, 0x07, 0x12, 0x1e, 0x16, 0x2a, 0x4b, 0x17, + 0x18, 0x22, 0x4e, 0x33, 0x27, 0x46, 0x35, 0x20, 0x22, 0x1d, 0x27, 0x26, 0x18, 0x2a, 0x39, 0x21, + 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, + 0x11, 0x0e, 0x03, 0x10, 0x0d, 0x65, 0x07, 0x13, 0x19, 0x15, 0x0f, 0x13, 0x0b, 0x04, 0x5d, 0x1b, + 0x11, 0x08, 0x11, 0x0d, 0x08, 0x0e, 0x06, 0x66, 0x0b, 0x0e, 0x0d, 0x1f, 0x34, 0x26, 0x23, 0x30, + 0x11, 0x11, 0x37, 0x2b, 0x22, 0x32, 0x22, 0x13, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x1c, 0x00, 0x46, 0x40, 0x27, 0x00, 0x1c, 0xb3, 0x19, + 0x1e, 0x0f, 0x10, 0x0f, 0x10, 0x1d, 0x1e, 0x00, 0x1e, 0x10, 0x1e, 0x02, 0x15, 0x0a, 0x05, 0x51, + 0x07, 0x1d, 0x1b, 0x0e, 0x0f, 0x04, 0x05, 0x15, 0x0a, 0x03, 0x06, 0x09, 0x04, 0x06, 0x08, 0x19, + 0x65, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0xfd, 0xd0, 0xc5, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd6, 0xfd, 0xc5, 0x31, 0x30, + 0x21, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, + 0x16, 0x16, 0x17, 0x33, 0x11, 0x23, 0x35, 0x01, 0x4c, 0x0a, 0x25, 0x2d, 0x31, 0x17, 0x7b, 0x7b, + 0x14, 0x2a, 0x27, 0x20, 0x0a, 0x8b, 0x0e, 0x24, 0x2d, 0x35, 0x1e, 0x2d, 0x4f, 0x22, 0x2b, 0x72, + 0x23, 0x51, 0x4d, 0x43, 0x17, 0xfe, 0xe5, 0x02, 0x6b, 0xfe, 0xff, 0x1c, 0x44, 0x44, 0x42, 0x1b, + 0x1b, 0x44, 0x4b, 0x4e, 0x25, 0x2b, 0x7b, 0x42, 0xfe, 0xf5, 0xa5, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x7a, 0x01, 0xc7, 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x4f, 0x40, 0x2e, 0x0d, 0x40, 0x0b, 0x0c, + 0x00, 0x4c, 0x0c, 0x20, 0x0b, 0x00, 0x4d, 0x00, 0x1a, 0xb3, 0x17, 0x1c, 0x0d, 0x16, 0x1c, 0x13, + 0x13, 0x1b, 0x0e, 0x1c, 0x05, 0x09, 0x44, 0x08, 0x1b, 0x18, 0x88, 0x0a, 0x13, 0x05, 0x03, 0x06, + 0x0d, 0x0a, 0x08, 0x0a, 0x06, 0x06, 0x17, 0x79, 0x00, 0x06, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, + 0x12, 0x17, 0x39, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0xc0, 0x10, 0xc6, 0x12, 0x39, 0x2f, 0x12, 0x39, + 0x39, 0x10, 0xd6, 0xfd, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x21, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, + 0x33, 0x15, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x17, 0x33, 0x15, 0x23, 0x35, + 0x01, 0x3f, 0x0a, 0x20, 0x25, 0x25, 0x10, 0x7c, 0x7c, 0x1c, 0x3b, 0x14, 0x94, 0x12, 0x2a, 0x2c, + 0x2c, 0x15, 0x1f, 0x42, 0x1d, 0x38, 0x72, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x01, 0xd6, 0xba, + 0x2a, 0x66, 0x2a, 0x17, 0x36, 0x38, 0x34, 0x16, 0x1e, 0x56, 0x2d, 0xec, 0x86, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xf0, 0x02, 0x6b, 0x00, 0x20, 0x00, 0x96, 0x40, 0x0d, + 0x10, 0x40, 0x0c, 0x0d, 0x00, 0x4c, 0x0f, 0x40, 0x0c, 0x0d, 0x00, 0x4c, 0x0e, 0xb8, 0xff, 0xc0, + 0xb4, 0x09, 0x0b, 0x00, 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0b, 0x00, 0x4c, 0x0a, 0xb8, + 0xff, 0xc0, 0xb4, 0x09, 0x0b, 0x00, 0x4c, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x40, 0x09, 0x0b, 0x00, + 0x4c, 0x08, 0x40, 0x0c, 0x00, 0x4d, 0x07, 0x40, 0x0c, 0x00, 0x4d, 0x20, 0x16, 0x00, 0x15, 0x1b, + 0x05, 0x21, 0x22, 0x05, 0x3f, 0x12, 0x4f, 0x12, 0x02, 0x12, 0x0f, 0x0f, 0x09, 0x4f, 0x08, 0x01, + 0x08, 0x0f, 0x0e, 0x1f, 0x0e, 0x2f, 0x0e, 0x03, 0x0e, 0xb3, 0x0c, 0x21, 0x12, 0x1b, 0x05, 0x03, + 0x00, 0x15, 0x04, 0x07, 0x08, 0x0f, 0x10, 0x0d, 0x04, 0x0a, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, + 0x3f, 0xd6, 0xd5, 0xd5, 0xc5, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xfd, 0x5d, 0xc5, 0x5d, + 0x33, 0x33, 0x2f, 0xc5, 0x5d, 0x32, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, + 0x15, 0x33, 0x35, 0x33, 0x15, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x01, + 0x74, 0x0e, 0x1c, 0x1e, 0x21, 0x14, 0x44, 0x25, 0x72, 0x72, 0x25, 0x44, 0x1d, 0x3d, 0x13, 0x7d, + 0x08, 0x1b, 0x25, 0x30, 0x1c, 0x18, 0x28, 0x27, 0x27, 0x15, 0x30, 0x46, 0x3e, 0x3a, 0x24, 0x84, + 0x88, 0xfe, 0xea, 0x02, 0x6b, 0xfa, 0x89, 0x8a, 0x36, 0x83, 0x42, 0x1b, 0x47, 0x4f, 0x52, 0x27, + 0x21, 0x42, 0x4d, 0x5a, 0x37, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xe7, + 0x01, 0xd6, 0x00, 0x1e, 0x00, 0x90, 0xb9, 0x00, 0x1b, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, 0x00, 0x4c, + 0x1a, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, 0x00, 0x4c, 0x17, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, + 0x00, 0x4c, 0x16, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, 0x00, 0x4c, 0x13, 0xb8, 0xff, 0xc0, 0x40, + 0x34, 0x09, 0x00, 0x4d, 0x09, 0x1f, 0x05, 0x0e, 0x0f, 0x06, 0x60, 0x06, 0x01, 0x05, 0x0f, 0x06, + 0x06, 0x0f, 0x05, 0x03, 0x1f, 0x20, 0x1e, 0x82, 0x1c, 0x1b, 0x13, 0x82, 0x15, 0x16, 0x1b, 0x51, + 0x19, 0x1f, 0x13, 0x15, 0x1c, 0x1e, 0x1a, 0x0a, 0x17, 0x06, 0x00, 0x05, 0x12, 0x0f, 0x09, 0x09, + 0x05, 0x0f, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, + 0x18, 0x3f, 0x3f, 0xd6, 0xd5, 0xd5, 0xc5, 0x01, 0x10, 0xd6, 0xfd, 0xd0, 0xd6, 0xed, 0x10, 0xd6, + 0xed, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x5d, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x06, 0x06, 0x07, 0x1e, 0x03, + 0x17, 0x23, 0x26, 0x26, 0x27, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, + 0x33, 0xfb, 0x0d, 0x20, 0x1d, 0x18, 0x07, 0x83, 0x1a, 0x4f, 0x2a, 0x19, 0x2b, 0x25, 0x1e, 0x0c, + 0x7c, 0x0e, 0x3c, 0x26, 0x45, 0x1f, 0x7b, 0x7b, 0x1f, 0x45, 0x01, 0x1f, 0x13, 0x2f, 0x30, 0x30, + 0x15, 0x33, 0x70, 0x2c, 0x18, 0x40, 0x47, 0x48, 0x20, 0x3c, 0x74, 0x2d, 0x75, 0x76, 0xde, 0x01, + 0xd6, 0xba, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xee, 0x02, 0x93, 0x00, 0x22, + 0x00, 0x58, 0xb9, 0x00, 0x06, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, 0x40, + 0x2a, 0x0b, 0x00, 0x4d, 0x0c, 0x17, 0x0b, 0x11, 0x04, 0x23, 0x24, 0x20, 0x1c, 0x01, 0x1c, 0x04, + 0x20, 0x02, 0x01, 0x02, 0x05, 0x51, 0x22, 0x1f, 0x20, 0x23, 0x1d, 0x08, 0x1c, 0x11, 0x06, 0x03, + 0x0b, 0x17, 0x08, 0x0b, 0x02, 0x1f, 0x05, 0x22, 0x02, 0x01, 0x98, 0x00, 0x3f, 0xd5, 0xc0, 0xd5, + 0xc0, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc0, 0x5d, 0xc5, + 0xc0, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, + 0x15, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x11, + 0x23, 0x11, 0x23, 0x35, 0x33, 0x55, 0x7b, 0x32, 0x32, 0x18, 0x27, 0x22, 0x1e, 0x0f, 0x88, 0x0e, + 0x26, 0x2f, 0x35, 0x1c, 0x1a, 0x39, 0x34, 0x2a, 0x0b, 0x87, 0x09, 0x1e, 0x28, 0x2f, 0x19, 0x7b, + 0x3a, 0x3a, 0x02, 0x93, 0x47, 0x56, 0x8c, 0x22, 0x39, 0x3b, 0x41, 0x2a, 0x23, 0x4a, 0x4b, 0x49, + 0x22, 0x1e, 0x4e, 0x57, 0x5b, 0x2a, 0x23, 0x4b, 0x4a, 0x45, 0x1e, 0xfe, 0xe5, 0x01, 0xf6, 0x56, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe7, 0x01, 0xfe, 0x00, 0x22, 0x00, 0x57, 0x40, 0x35, + 0x22, 0x20, 0x0a, 0x0b, 0x00, 0x4c, 0xa0, 0x0a, 0xb0, 0x0a, 0x02, 0x0a, 0x00, 0x14, 0x01, 0x14, + 0x24, 0x1a, 0x04, 0x00, 0x02, 0x20, 0x02, 0x30, 0x02, 0x03, 0x02, 0x00, 0x03, 0x51, 0x20, 0x1d, + 0x1e, 0x23, 0x02, 0x1e, 0x81, 0x1f, 0x0a, 0x1a, 0x0f, 0x04, 0x03, 0x09, 0x1b, 0x06, 0x15, 0x06, + 0x09, 0x0a, 0x21, 0x00, 0x0a, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xd5, 0x32, 0xfd, 0x32, 0xcd, 0x5d, 0x33, 0x33, 0x10, 0xd6, 0x5d, 0xc6, + 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x33, 0x15, 0x23, 0x15, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, + 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, + 0xbb, 0x43, 0x43, 0x16, 0x2b, 0x25, 0x1f, 0x0a, 0x94, 0x0e, 0x2c, 0x33, 0x38, 0x1a, 0x19, 0x3b, + 0x39, 0x2f, 0x0c, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x2d, 0x2d, 0x7c, 0x01, 0xd6, 0x41, + 0x79, 0x15, 0x31, 0x32, 0x30, 0x12, 0x17, 0x36, 0x37, 0x35, 0x16, 0x18, 0x42, 0x48, 0x47, 0x1e, + 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x01, 0x95, 0x41, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x00, 0x18, 0x00, 0x3d, 0x40, 0x22, 0x07, 0x10, 0x06, 0x0a, + 0x04, 0x0f, 0x0f, 0x19, 0x1a, 0x15, 0x02, 0x44, 0x18, 0x50, 0x17, 0x01, 0x17, 0x00, 0x19, 0x15, + 0x0a, 0x03, 0x03, 0x06, 0x16, 0x08, 0x10, 0x08, 0x06, 0x02, 0x18, 0x48, 0x01, 0x02, 0x00, 0x3f, + 0xed, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0x32, 0xed, 0x32, 0x11, + 0x12, 0x39, 0x2f, 0x17, 0x39, 0x31, 0x30, 0x13, 0x35, 0x33, 0x11, 0x36, 0x36, 0x37, 0x33, 0x06, + 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x12, 0xd4, 0x23, 0x38, + 0x11, 0x8b, 0x16, 0x43, 0x40, 0x19, 0x32, 0x2c, 0x23, 0x0b, 0x8b, 0x08, 0x1b, 0x21, 0x24, 0x10, + 0x7b, 0x02, 0x05, 0x66, 0xfe, 0xff, 0x40, 0x85, 0x3c, 0x39, 0x8d, 0x59, 0x1e, 0x50, 0x58, 0x5c, + 0x2a, 0x23, 0x51, 0x4d, 0x43, 0x17, 0xfe, 0xe5, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, + 0x00, 0x00, 0x01, 0xe7, 0x01, 0xd6, 0x00, 0x1c, 0x00, 0x40, 0x40, 0x23, 0x11, 0x05, 0x0b, 0x03, + 0x1d, 0x10, 0x1e, 0x60, 0x06, 0x01, 0x06, 0x06, 0x1d, 0x1e, 0x16, 0x1c, 0x51, 0x19, 0x1b, 0x1d, + 0x16, 0x0b, 0x00, 0x03, 0x17, 0x19, 0x48, 0x1c, 0x0a, 0x17, 0x06, 0x11, 0x06, 0x05, 0x0a, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xdd, 0xed, 0x32, 0x11, 0x12, + 0x39, 0x2f, 0x5d, 0x12, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, + 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0xda, + 0x0e, 0x1e, 0x1c, 0x18, 0x07, 0x94, 0x0d, 0x26, 0x2b, 0x2e, 0x14, 0x17, 0x34, 0x30, 0x29, 0x0e, + 0x8d, 0x0a, 0x1f, 0x23, 0x25, 0x0f, 0x7b, 0x4d, 0xc8, 0x01, 0x1c, 0x15, 0x32, 0x33, 0x2f, 0x11, + 0x17, 0x36, 0x38, 0x34, 0x16, 0x14, 0x41, 0x4b, 0x4b, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, + 0x01, 0x70, 0x66, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x0f, + 0x00, 0x4a, 0x40, 0x17, 0x0f, 0x0d, 0x1f, 0x0d, 0x02, 0x0d, 0x51, 0x0f, 0x01, 0x0b, 0x51, 0x20, + 0x08, 0x30, 0x08, 0x40, 0x08, 0x03, 0x08, 0x02, 0x07, 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x14, + 0x0b, 0x0e, 0x48, 0x05, 0x10, 0x0e, 0x0e, 0x0a, 0x02, 0x02, 0x55, 0x07, 0x06, 0x02, 0x03, 0x08, + 0x0b, 0x55, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xd5, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0x32, 0xd6, 0x5d, 0xed, 0xd0, 0xd5, 0xed, 0x5d, 0x31, 0x30, 0x21, 0x11, 0x23, 0x11, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0x33, 0x11, 0x23, 0x35, 0x01, 0x3a, 0x92, 0x7b, + 0x7b, 0x92, 0x7c, 0x23, 0x72, 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0xfd, 0xfb, 0xfe, + 0xf5, 0xa5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0x7a, 0x01, 0xd3, 0x01, 0xd6, 0x00, 0x0f, + 0x00, 0x6a, 0xb9, 0x00, 0x0d, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0x40, + 0x2c, 0x0b, 0x00, 0x4d, 0x01, 0x09, 0x51, 0x0a, 0x20, 0x0f, 0x01, 0x0f, 0x0c, 0x11, 0x02, 0x07, + 0x51, 0x10, 0x05, 0x20, 0x05, 0x30, 0x05, 0x70, 0x05, 0x04, 0x05, 0x10, 0x0d, 0x0f, 0x06, 0x01, + 0x55, 0x08, 0x0b, 0x08, 0x0b, 0x09, 0x0a, 0x06, 0x0a, 0x03, 0x06, 0x00, 0x06, 0x00, 0x3f, 0x3f, + 0x3f, 0x3f, 0x39, 0x39, 0x2f, 0x2f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x10, + 0xd6, 0xc5, 0x5d, 0xde, 0xed, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x35, 0x23, 0x15, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0x35, 0x01, 0x34, 0x7e, 0x7b, + 0x7b, 0x7e, 0x7b, 0x24, 0x72, 0xba, 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0xfe, 0x90, 0xec, 0x86, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xe2, 0x02, 0x6b, 0x00, 0x0d, 0x00, 0x8a, 0xb6, 0x20, + 0x01, 0x01, 0x20, 0x00, 0x01, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x0b, 0xb8, 0xff, + 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x06, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x05, 0xb8, 0xff, + 0xc0, 0x40, 0x20, 0x0d, 0x00, 0x4d, 0x0d, 0x05, 0x20, 0x0c, 0x30, 0x0c, 0x02, 0x0c, 0x44, 0x20, + 0x02, 0x01, 0x02, 0x01, 0x0f, 0x06, 0x2f, 0x0a, 0x3f, 0x0a, 0x02, 0x0a, 0x44, 0xc0, 0x09, 0xd0, + 0x09, 0x02, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, 0x0e, 0x48, 0x09, 0x0e, 0x0d, 0x02, 0x0a, + 0x02, 0x07, 0x08, 0x0c, 0x0b, 0x48, 0x05, 0x02, 0x05, 0x02, 0x05, 0x04, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x3f, 0x3f, 0x2f, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x32, 0x3f, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0x2b, 0x5d, 0xed, 0x71, 0x32, 0x10, 0xd6, 0xdd, 0x71, 0xed, 0x71, 0x32, 0x32, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x71, 0x71, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0xe2, 0x59, 0x7b, 0x66, 0x7b, 0x7b, 0x66, 0x02, 0x6b, + 0x66, 0xfd, 0xfb, 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0x00, 0x00, 0x01, 0x00, 0x3b, + 0x00, 0x00, 0x01, 0xe2, 0x01, 0xd6, 0x00, 0x0d, 0x00, 0x4e, 0x40, 0x16, 0x3f, 0x0b, 0x01, 0x00, + 0x01, 0x51, 0x04, 0x0b, 0x05, 0x0a, 0x51, 0x40, 0x08, 0x50, 0x08, 0x02, 0xa0, 0x08, 0xb0, 0x08, + 0x02, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0b, 0x0e, 0x48, 0x08, 0x0e, 0x0b, 0x55, 0x04, 0x01, + 0x04, 0x01, 0x04, 0x03, 0x0c, 0x0a, 0x09, 0x0a, 0x06, 0x06, 0x03, 0x06, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0x71, 0xfd, 0x32, + 0xd6, 0x32, 0xfd, 0xc5, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x23, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, + 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x01, 0xe2, 0x4d, 0x7c, 0x63, 0x7b, 0x7b, 0x63, 0xc9, 0x01, + 0x70, 0xfe, 0x90, 0xba, 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, + 0xff, 0x5b, 0x01, 0xde, 0x02, 0x6b, 0x00, 0x26, 0x00, 0x5c, 0x40, 0x3b, 0x50, 0x18, 0x01, 0x18, + 0x84, 0x5f, 0x07, 0x7f, 0x07, 0x8f, 0x07, 0x9f, 0x07, 0x04, 0x07, 0x40, 0x09, 0x0c, 0x48, 0x07, + 0x28, 0x1f, 0x01, 0x40, 0x0b, 0x0f, 0x48, 0x01, 0x85, 0x22, 0x23, 0x85, 0x50, 0x26, 0x60, 0x26, + 0x70, 0x26, 0x03, 0x26, 0x0f, 0x27, 0x24, 0x08, 0x01, 0xa5, 0x1f, 0x22, 0x1f, 0x22, 0x1f, 0x00, + 0x21, 0x08, 0x13, 0xa5, 0x0c, 0x0f, 0x00, 0x00, 0x2f, 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x10, 0xed, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0xfd, 0xde, 0xed, 0x2b, 0x32, 0x10, 0xde, + 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x07, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0x27, 0x08, 0x0d, 0x08, 0x4a, + 0x50, 0x11, 0x27, 0x3e, 0x2e, 0x08, 0x11, 0x09, 0x05, 0x07, 0x09, 0x08, 0x11, 0x1b, 0x12, 0x0a, + 0x0a, 0x13, 0x1a, 0x10, 0x07, 0x08, 0x61, 0x42, 0x60, 0x02, 0x6b, 0xe2, 0x01, 0x02, 0x85, 0x92, + 0x41, 0x68, 0x49, 0x28, 0x01, 0x01, 0x5c, 0x01, 0x12, 0x2b, 0x47, 0x35, 0x3a, 0x4a, 0x2a, 0x10, + 0x02, 0xfe, 0xd3, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, + 0xff, 0x5b, 0x01, 0xde, 0x01, 0xd6, 0x00, 0x26, 0x00, 0x5b, 0x40, 0x1e, 0x50, 0x18, 0x01, 0x18, + 0x84, 0x0f, 0x07, 0x1f, 0x07, 0x3f, 0x07, 0x5f, 0x07, 0x7f, 0x07, 0x05, 0x07, 0x28, 0x1f, 0x01, + 0x40, 0x0c, 0x0f, 0x48, 0x01, 0x85, 0x22, 0x23, 0x85, 0x26, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0e, + 0x12, 0x48, 0x26, 0x0f, 0x27, 0x24, 0x06, 0x21, 0x06, 0x01, 0xa5, 0x1f, 0x22, 0x1f, 0x22, 0x1f, + 0x00, 0x10, 0xa5, 0x0f, 0x0f, 0x00, 0x0a, 0x00, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0xfd, 0xde, 0xed, 0x2b, 0x32, 0x10, 0xde, + 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x07, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0x27, 0x08, 0x0d, 0x08, 0x4a, 0x50, + 0x11, 0x27, 0x3e, 0x2e, 0x08, 0x11, 0x09, 0x05, 0x07, 0x09, 0x08, 0x11, 0x1b, 0x12, 0x0a, 0x0a, + 0x13, 0x1a, 0x10, 0x07, 0x08, 0x61, 0x42, 0x60, 0x01, 0xd6, 0xb4, 0x01, 0x02, 0x6c, 0x77, 0x35, + 0x55, 0x3c, 0x21, 0x01, 0x01, 0x5c, 0x01, 0x0d, 0x1f, 0x34, 0x26, 0x2a, 0x36, 0x1f, 0x0b, 0x02, + 0xc6, 0x01, 0x79, 0xfe, 0x87, 0x01, 0xd6, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0x5c, 0x01, 0xea, + 0x02, 0x79, 0x00, 0x32, 0x00, 0x44, 0x00, 0x9b, 0xb9, 0x00, 0x30, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x08, 0xb8, 0xff, 0xe0, 0x40, 0x5b, 0x0d, 0x00, 0x4d, 0x2f, 0x40, 0x0d, 0x00, 0x4d, 0x2e, + 0x40, 0x0d, 0x00, 0x4d, 0x2d, 0x40, 0x0d, 0x00, 0x4d, 0x2c, 0x40, 0x0d, 0x00, 0x4d, 0x2b, 0x40, + 0x0d, 0x00, 0x4d, 0x2b, 0x5f, 0x2a, 0x01, 0x2a, 0x46, 0x14, 0x17, 0x46, 0x05, 0x84, 0x33, 0x33, + 0x20, 0x30, 0x3b, 0x40, 0x3b, 0x50, 0x3b, 0x03, 0x3b, 0x84, 0x0f, 0x0f, 0x1f, 0x0f, 0x02, 0x0f, + 0x40, 0x0c, 0x10, 0x48, 0x0f, 0x46, 0x00, 0x63, 0x20, 0x1b, 0x45, 0x14, 0x36, 0x2b, 0x0a, 0x40, + 0x03, 0x36, 0x36, 0x03, 0x40, 0x0a, 0x2b, 0x05, 0x1b, 0x2e, 0x4a, 0x25, 0x03, 0x17, 0x4a, 0x18, + 0x1b, 0x09, 0x00, 0x3f, 0xdd, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x11, 0x39, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xde, 0x2b, 0x5d, 0xed, 0x5d, 0x12, 0x39, 0x2f, + 0xed, 0x10, 0xd6, 0xce, 0x10, 0xd4, 0x5d, 0xcd, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x13, 0x14, 0x16, 0x17, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x17, 0x14, + 0x16, 0x17, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x86, 0x1b, 0x22, 0x0a, + 0x12, 0x27, 0x3c, 0x2a, 0x26, 0x37, 0x24, 0x11, 0x13, 0x27, 0x3c, 0x29, 0x12, 0x39, 0x29, 0x10, + 0x43, 0x66, 0x20, 0x34, 0x4f, 0x36, 0x1b, 0x20, 0x43, 0x65, 0x45, 0x1a, 0x27, 0x1f, 0x1d, 0x11, + 0x1f, 0x21, 0x2d, 0x17, 0x2e, 0x3f, 0x26, 0x10, 0x9e, 0x03, 0x05, 0x16, 0x20, 0x14, 0x09, 0x04, + 0x09, 0x11, 0x0c, 0x0f, 0x13, 0x0b, 0x04, 0x01, 0x36, 0x4b, 0x69, 0x1a, 0x31, 0x36, 0x30, 0x57, + 0x41, 0x27, 0x20, 0x35, 0x45, 0x26, 0x29, 0x4e, 0x43, 0x33, 0x0d, 0x1d, 0x23, 0x03, 0x65, 0x02, + 0x58, 0x43, 0x04, 0x35, 0x54, 0x6e, 0x3e, 0x42, 0x77, 0x59, 0x35, 0x04, 0x07, 0x0a, 0x07, 0x64, + 0x0e, 0x07, 0x23, 0x3b, 0x4e, 0xa0, 0x1c, 0x34, 0x17, 0x08, 0x21, 0x2a, 0x30, 0x18, 0x14, 0x25, + 0x1c, 0x10, 0x18, 0x2a, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0xff, 0x7c, 0x01, 0xea, + 0x01, 0xe2, 0x00, 0x2f, 0x00, 0x3c, 0x00, 0x8b, 0xb9, 0x00, 0x14, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x4f, 0x0d, 0x00, 0x4d, 0x14, 0x40, 0x0f, 0x00, 0x4d, 0x13, + 0x40, 0x0f, 0x00, 0x4d, 0x12, 0x40, 0x0f, 0x00, 0x4d, 0x11, 0x40, 0x0f, 0x00, 0x4d, 0x03, 0x2c, + 0x2f, 0x3e, 0x1d, 0x84, 0x30, 0x30, 0x08, 0x40, 0x38, 0x50, 0x38, 0x02, 0x38, 0x84, 0x27, 0x11, + 0x10, 0x3e, 0x19, 0x63, 0x08, 0x3d, 0x2c, 0x07, 0x3a, 0x4a, 0x22, 0x1b, 0x33, 0x33, 0x1b, 0x22, + 0x03, 0x03, 0x11, 0x40, 0x0e, 0x00, 0x4d, 0x11, 0x14, 0x40, 0x0e, 0x00, 0x4d, 0x14, 0x4a, 0x0d, + 0x0b, 0x2f, 0x4a, 0x00, 0x03, 0x07, 0x00, 0x3f, 0xdd, 0xed, 0x3f, 0xed, 0x2b, 0x32, 0x2b, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xde, 0xed, 0x10, 0xc4, 0x32, 0xd6, 0xed, + 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x10, 0xd6, 0xde, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x05, 0x26, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x17, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x16, 0x16, 0x17, 0x27, 0x14, 0x16, 0x17, + 0x3e, 0x03, 0x35, 0x34, 0x23, 0x22, 0x06, 0x01, 0xcd, 0x50, 0x7b, 0x23, 0x33, 0x4e, 0x33, 0x1a, + 0x1e, 0x3d, 0x5b, 0x3c, 0x23, 0x3c, 0x1d, 0x1b, 0x17, 0x25, 0x1a, 0x27, 0x35, 0x1f, 0x0d, 0x36, + 0x03, 0x1d, 0x30, 0x3c, 0x1f, 0x1a, 0x32, 0x26, 0x17, 0x10, 0x21, 0x31, 0x21, 0x16, 0x3b, 0x26, + 0xba, 0x04, 0x04, 0x18, 0x20, 0x13, 0x08, 0x2a, 0x15, 0x1c, 0x84, 0x08, 0x40, 0x38, 0x07, 0x2b, + 0x40, 0x52, 0x2f, 0x2e, 0x58, 0x44, 0x29, 0x05, 0x0b, 0x65, 0x07, 0x03, 0x18, 0x28, 0x32, 0x1b, + 0x66, 0x23, 0x15, 0x14, 0x2f, 0x44, 0x2d, 0x16, 0x10, 0x22, 0x33, 0x24, 0x1b, 0x37, 0x30, 0x26, + 0x0b, 0x0d, 0x11, 0x05, 0xa7, 0x11, 0x1c, 0x0d, 0x04, 0x13, 0x1b, 0x1e, 0x0f, 0x30, 0x28, 0x00, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd5, 0x02, 0x79, 0x02, 0x06, 0x00, 0xa2, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0x56, 0x01, 0xd2, 0x01, 0xe2, 0x02, 0x06, 0x00, 0xc2, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x19, 0xff, 0x5b, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x31, 0x40, 0x1a, + 0x00, 0x02, 0x02, 0x04, 0x03, 0x44, 0xb0, 0x07, 0x01, 0x07, 0x09, 0xd0, 0x0b, 0x01, 0x0b, 0x0c, + 0x02, 0x09, 0x55, 0x0b, 0x02, 0x06, 0x04, 0x55, 0x07, 0x08, 0x00, 0x3f, 0xed, 0xc5, 0x3f, 0xfd, + 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0xdd, 0xcd, 0x5d, 0xfd, 0xcd, 0x33, 0x10, 0xcd, 0x31, 0x30, 0x01, + 0x15, 0x23, 0x11, 0x33, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x35, 0x01, 0xdb, 0xa3, 0x44, 0x73, + 0x4d, 0xa3, 0x02, 0x6b, 0x66, 0xfe, 0x61, 0xfe, 0xf5, 0xa5, 0x02, 0x05, 0x66, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x26, 0xff, 0x7a, 0x01, 0xcf, 0x01, 0xd6, 0x00, 0x0b, 0x00, 0x2d, 0x40, 0x16, + 0x04, 0x03, 0x02, 0x0b, 0x01, 0x01, 0x02, 0x44, 0x06, 0x08, 0x0a, 0x0c, 0x01, 0x08, 0x48, 0x0a, + 0x0a, 0x07, 0x06, 0x05, 0x06, 0x06, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xdd, 0xcd, 0xed, 0x32, 0x10, 0xcd, 0x10, 0xcd, 0x32, 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x15, + 0x23, 0x35, 0x23, 0x11, 0x23, 0x35, 0x21, 0x01, 0xcf, 0x97, 0x58, 0x72, 0x62, 0x96, 0x01, 0xa9, + 0x01, 0x70, 0xfe, 0xf6, 0xec, 0x86, 0x01, 0x70, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, + 0xff, 0x5b, 0x01, 0xe6, 0x01, 0xd6, 0x00, 0x14, 0x00, 0x3a, 0x40, 0x1d, 0x03, 0x04, 0x51, 0x06, + 0x09, 0x0a, 0x15, 0x14, 0x00, 0x16, 0x05, 0x05, 0x15, 0x16, 0x0f, 0x06, 0x03, 0x03, 0x06, 0x0f, + 0x03, 0x04, 0x14, 0x0a, 0x0a, 0x0a, 0x05, 0x12, 0x04, 0x00, 0x2f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x33, + 0xed, 0x32, 0x31, 0x30, 0x01, 0x06, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x33, 0x1e, + 0x03, 0x17, 0x3e, 0x03, 0x37, 0x01, 0xe6, 0x26, 0x5e, 0x2f, 0x7b, 0x2e, 0x57, 0x25, 0x81, 0x09, + 0x1a, 0x1c, 0x1d, 0x0c, 0x0c, 0x1f, 0x20, 0x1d, 0x0a, 0x01, 0xd6, 0x81, 0xe3, 0x5e, 0xb9, 0xbb, + 0x5e, 0xe4, 0x7e, 0x27, 0x59, 0x57, 0x50, 0x20, 0x20, 0x50, 0x57, 0x58, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x1a, 0x00, 0x8b, 0xb9, 0x00, + 0x14, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x00, 0x4d, 0x13, + 0xb8, 0xff, 0xe0, 0xb3, 0x17, 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xe0, 0x40, 0x3a, 0x0f, 0x00, 0x4d, 0x05, 0x44, 0x06, 0x1c, 0x14, 0x11, 0xaf, 0x0f, + 0xbf, 0x0f, 0x02, 0x12, 0x11, 0x0f, 0x0c, 0x00, 0x0c, 0x0f, 0x00, 0x11, 0x12, 0x05, 0x1b, 0x1c, + 0x18, 0x44, 0x17, 0x1b, 0x18, 0x02, 0x00, 0x5f, 0x11, 0x6f, 0x11, 0x02, 0x5f, 0x0e, 0x6f, 0x0e, + 0x02, 0x14, 0x0b, 0x11, 0x0e, 0x0e, 0x11, 0x0b, 0x14, 0x04, 0x05, 0x0f, 0x08, 0x05, 0x02, 0x00, + 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x39, 0x3f, 0x01, 0x10, 0xd6, + 0xed, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x12, 0x39, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, + 0x07, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x26, 0x26, 0x27, 0x33, 0x16, 0x16, + 0xfe, 0x0b, 0x1d, 0x1d, 0x1b, 0x0b, 0x7f, 0x12, 0x25, 0x29, 0x2e, 0x1b, 0x78, 0x7e, 0x7c, 0x7c, + 0x75, 0x34, 0x50, 0x25, 0x84, 0x17, 0x38, 0x01, 0x50, 0x17, 0x46, 0x4e, 0x50, 0x20, 0x32, 0x5d, + 0x5b, 0x5b, 0x2f, 0x52, 0xa5, 0xa5, 0x52, 0x5e, 0xb4, 0x62, 0x48, 0x95, 0x00, 0x01, 0x00, 0x0e, + 0xff, 0x5b, 0x01, 0xe6, 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x75, 0x40, 0x17, 0x0c, 0x40, 0x0b, 0x00, + 0x4d, 0x05, 0x40, 0x1f, 0x20, 0x00, 0x4c, 0x05, 0x40, 0x1d, 0x00, 0x4d, 0x04, 0x40, 0x1e, 0x20, + 0x00, 0x4c, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x2e, 0x0b, 0x0c, 0x00, 0x4c, 0x0c, 0x0b, 0x09, 0x03, + 0x06, 0x04, 0x0b, 0x09, 0x06, 0x04, 0x15, 0x04, 0x06, 0x15, 0x09, 0x0b, 0x05, 0x1b, 0x1c, 0x1a, + 0x44, 0x00, 0x1c, 0x10, 0x44, 0x0f, 0x1b, 0x15, 0x1c, 0x1a, 0x0a, 0x10, 0x0a, 0x09, 0x06, 0x07, + 0x12, 0x0c, 0x03, 0x7d, 0x06, 0x06, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, + 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x06, 0x06, 0x07, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x26, 0x26, 0x27, 0x33, + 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x01, 0xe6, 0x20, 0x4d, 0x27, 0x4d, 0x6c, 0x7b, 0x6f, 0x52, + 0x26, 0x48, 0x1f, 0x81, 0x09, 0x1a, 0x1c, 0x1d, 0x0c, 0x0c, 0x1f, 0x20, 0x1d, 0x0a, 0x01, 0xd6, + 0x6c, 0xc3, 0x55, 0x52, 0xa5, 0xa5, 0x52, 0x56, 0xc4, 0x6a, 0x27, 0x59, 0x57, 0x50, 0x20, 0x20, + 0x50, 0x57, 0x58, 0x28, 0x00, 0x01, 0x00, 0x0b, 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x19, + 0x00, 0x4b, 0x40, 0x29, 0x0c, 0x0e, 0x06, 0x07, 0x04, 0x1a, 0x0f, 0x00, 0x10, 0x12, 0x03, 0x03, + 0x16, 0x0f, 0x03, 0x0f, 0x03, 0x1a, 0x18, 0xb3, 0x11, 0x16, 0x1b, 0x0d, 0x1a, 0x18, 0x12, 0x10, + 0x02, 0x03, 0x0c, 0x12, 0x0f, 0x04, 0x06, 0x0d, 0x02, 0x06, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, + 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xd6, 0xc6, 0xed, 0x12, 0x39, 0x39, + 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x21, 0x26, 0x26, + 0x27, 0x06, 0x06, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x16, 0x16, + 0x17, 0x33, 0x11, 0x23, 0x35, 0x01, 0x52, 0x12, 0x35, 0x1d, 0x1a, 0x31, 0x13, 0x85, 0x0a, 0x24, + 0x2b, 0x30, 0x16, 0x95, 0x85, 0x54, 0x64, 0x7b, 0x99, 0x22, 0x3e, 0x19, 0x2c, 0x72, 0x33, 0x7c, + 0x3e, 0x3b, 0x7f, 0x33, 0x1b, 0x4c, 0x58, 0x5d, 0x2b, 0x01, 0x24, 0xc6, 0xc6, 0xfe, 0xdf, 0x38, + 0x77, 0x35, 0xfe, 0xf5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0xff, 0x7a, 0x01, 0xc9, + 0x01, 0xd6, 0x00, 0x19, 0x00, 0x4f, 0x40, 0x2a, 0x10, 0x0d, 0x0f, 0x07, 0x03, 0x08, 0x01, 0x11, + 0x13, 0x03, 0x04, 0x17, 0x08, 0x04, 0x08, 0x04, 0x1a, 0x19, 0x12, 0x17, 0x1b, 0x0e, 0x1a, 0x11, + 0x0a, 0x04, 0x0d, 0x13, 0x10, 0x04, 0x07, 0x0e, 0x0a, 0x07, 0x06, 0x01, 0x06, 0x18, 0x17, 0x55, + 0x00, 0x06, 0x00, 0x3f, 0xed, 0xc5, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x01, 0x10, 0xc6, + 0x10, 0xd6, 0xc6, 0xc5, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, + 0x17, 0x39, 0x32, 0x31, 0x30, 0x21, 0x23, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, 0x3e, 0x03, + 0x37, 0x27, 0x33, 0x17, 0x37, 0x33, 0x07, 0x16, 0x16, 0x17, 0x33, 0x15, 0x23, 0x01, 0x67, 0x18, + 0x1a, 0x33, 0x17, 0x1a, 0x2a, 0x16, 0x7d, 0x0d, 0x24, 0x28, 0x2b, 0x14, 0x97, 0x81, 0x5a, 0x5c, + 0x7d, 0x93, 0x19, 0x32, 0x16, 0x30, 0x60, 0x33, 0x50, 0x20, 0x28, 0x4b, 0x30, 0x1c, 0x3d, 0x3f, + 0x3e, 0x1c, 0xe4, 0x93, 0x93, 0xe2, 0x20, 0x4a, 0x24, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, + 0xff, 0x5e, 0x01, 0xe4, 0x02, 0x72, 0x00, 0x0f, 0x00, 0x48, 0x40, 0x0b, 0x0b, 0x44, 0x08, 0x0f, + 0x04, 0x01, 0x04, 0x44, 0x07, 0x11, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x0a, 0x0e, 0x48, 0x00, + 0x03, 0x44, 0x20, 0x0c, 0x30, 0x0c, 0x02, 0x0c, 0x0f, 0x10, 0x07, 0x48, 0x03, 0x48, 0x0c, 0x08, + 0x0a, 0x12, 0x05, 0x02, 0x0d, 0x02, 0x72, 0x00, 0x02, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0x3f, 0x3f, + 0xed, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0xfd, 0xc4, 0x2b, 0x10, 0xdc, 0xed, 0x5d, 0xdd, 0xed, + 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, + 0x23, 0x35, 0x01, 0x18, 0x45, 0x72, 0x7c, 0x23, 0x7b, 0xfe, 0xee, 0x46, 0x02, 0x72, 0x6e, 0xfe, + 0x73, 0x01, 0xfb, 0xfe, 0x05, 0xfe, 0xe7, 0xa2, 0x02, 0x04, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x12, + 0xff, 0x7a, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x0f, 0x00, 0x48, 0x40, 0x2e, 0x0c, 0x40, 0x0b, 0x0e, + 0x00, 0x4c, 0x0b, 0x40, 0x0b, 0x0e, 0x00, 0x4c, 0x0d, 0x79, 0x0b, 0x09, 0x79, 0x08, 0xcf, 0x04, + 0x01, 0x04, 0x05, 0x79, 0xaf, 0x00, 0xbf, 0x00, 0xcf, 0x00, 0x03, 0x00, 0x01, 0x10, 0x0f, 0x07, + 0x0a, 0x07, 0x72, 0x0c, 0x0e, 0x07, 0x09, 0x0a, 0x03, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0xed, + 0x32, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0xfd, 0xd5, 0x5d, 0xd6, 0xfd, 0xd6, 0xed, 0x31, 0x30, + 0x2b, 0x2b, 0x13, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, + 0x35, 0x21, 0x59, 0x47, 0xf8, 0x47, 0x89, 0x6a, 0x23, 0x69, 0xfe, 0xe9, 0x01, 0x79, 0x5d, 0x5d, + 0xfe, 0xed, 0x01, 0x70, 0xfe, 0x90, 0xec, 0x86, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xd9, + 0x02, 0x6b, 0x00, 0x1a, 0x00, 0x46, 0xb3, 0x02, 0x15, 0x51, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x0b, + 0x09, 0x0e, 0x48, 0x16, 0x00, 0xb3, 0x18, 0x1c, 0x0c, 0x51, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x14, + 0x0b, 0x0e, 0x48, 0x0b, 0x1b, 0x1a, 0x12, 0x12, 0x53, 0x05, 0x05, 0x01, 0x16, 0x02, 0x0c, 0x02, + 0x18, 0x72, 0x01, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0xed, 0xd6, 0x2b, 0xed, 0x32, 0x31, 0x30, 0x21, 0x23, 0x35, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x11, + 0x33, 0x11, 0x33, 0x11, 0x23, 0x01, 0x67, 0x2d, 0x17, 0x21, 0x14, 0x2c, 0x47, 0x33, 0x1b, 0x7b, + 0x09, 0x15, 0x21, 0x18, 0x1c, 0x1f, 0x7c, 0x23, 0x72, 0xcf, 0x03, 0x04, 0x14, 0x34, 0x59, 0x45, + 0xbd, 0xb6, 0x26, 0x30, 0x1d, 0x0b, 0x07, 0x01, 0x2d, 0xfd, 0xfb, 0xfe, 0xf5, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2b, 0xff, 0x7a, 0x01, 0xc7, 0x01, 0xd6, 0x00, 0x1d, 0x00, 0x72, 0x40, 0x0a, + 0x1c, 0x40, 0x0c, 0x0e, 0x00, 0x4c, 0x2f, 0x1c, 0x01, 0x1b, 0xb8, 0xff, 0xd0, 0x40, 0x3f, 0x0f, + 0x00, 0x4d, 0x1b, 0x18, 0x0e, 0x00, 0x4d, 0x1b, 0x10, 0x0d, 0x00, 0x4d, 0x1b, 0x40, 0x0c, 0x00, + 0x4d, 0x2f, 0x1b, 0x01, 0x02, 0x17, 0x51, 0x00, 0x19, 0x10, 0x19, 0x02, 0x19, 0x5f, 0x1d, 0x01, + 0x1d, 0xb3, 0x1b, 0x1f, 0x0f, 0x51, 0x30, 0x0c, 0x01, 0x0c, 0x1e, 0x20, 0x12, 0x01, 0x12, 0x53, + 0x07, 0x07, 0x01, 0x18, 0x06, 0x0e, 0x06, 0x01, 0x0a, 0x1c, 0x1b, 0x72, 0x00, 0x0a, 0x00, 0x3f, + 0xed, 0xc5, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, + 0xd6, 0xed, 0x5d, 0xd6, 0x5d, 0xed, 0x32, 0x31, 0x30, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, + 0x21, 0x23, 0x35, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x3e, 0x02, 0x37, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0x01, 0x55, 0x2d, 0x07, 0x15, 0x16, + 0x12, 0x04, 0x2a, 0x44, 0x2e, 0x19, 0x7b, 0x2a, 0x1f, 0x03, 0x0f, 0x11, 0x11, 0x05, 0x7c, 0x23, + 0x72, 0x9a, 0x01, 0x02, 0x02, 0x01, 0x11, 0x27, 0x41, 0x30, 0x99, 0x98, 0x22, 0x1d, 0x01, 0x01, + 0x02, 0x01, 0xd2, 0xfe, 0x90, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x47, 0x40, 0x29, 0x18, 0x15, 0x44, 0x0f, 0x14, 0x01, 0x14, 0x1b, + 0x0f, 0x82, 0x02, 0x0e, 0x20, 0x0a, 0x30, 0x0a, 0x02, 0x0a, 0x44, 0xa0, 0x07, 0xb0, 0x07, 0x02, + 0x07, 0x1c, 0x0f, 0x0d, 0x10, 0x4a, 0x02, 0x00, 0x1b, 0x1b, 0x14, 0x17, 0x08, 0x14, 0x04, 0x08, + 0x04, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xc5, 0xc0, 0xfd, 0xd5, 0xc5, 0x01, 0x10, 0xd6, + 0x5d, 0xfd, 0x5d, 0xd6, 0xc0, 0xfd, 0xc0, 0xd6, 0x5d, 0xed, 0xc0, 0x31, 0x30, 0x25, 0x23, 0x35, + 0x2e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x17, 0x35, 0x33, 0x15, 0x36, 0x36, 0x37, 0x11, + 0x33, 0x11, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x18, 0x44, 0x29, 0x44, 0x31, 0x1b, 0x7b, 0x1e, + 0x20, 0x44, 0x0d, 0x1b, 0x0c, 0x7b, 0x7b, 0x0e, 0x19, 0x0d, 0x60, 0x69, 0x02, 0x19, 0x35, 0x56, + 0x3f, 0xbd, 0xba, 0x3a, 0x37, 0x08, 0x6e, 0x72, 0x01, 0x03, 0x02, 0x01, 0x31, 0xfd, 0x95, 0xcf, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc9, 0x01, 0xd6, 0x00, 0x18, + 0x00, 0x6f, 0x40, 0x2a, 0x15, 0x40, 0x12, 0x01, 0x12, 0x51, 0x0f, 0x11, 0x1f, 0x11, 0x02, 0x11, + 0x18, 0x0f, 0x0c, 0x01, 0xaf, 0x0c, 0xbf, 0x0c, 0xef, 0x0c, 0xff, 0x0c, 0x04, 0x0c, 0x82, 0x02, + 0x0f, 0x0b, 0x1f, 0x0b, 0x02, 0x0b, 0x20, 0x08, 0x30, 0x08, 0x02, 0x08, 0x51, 0x06, 0xb8, 0xff, + 0xc0, 0x40, 0x1b, 0x0b, 0x10, 0x48, 0x06, 0x19, 0x0a, 0x0d, 0x57, 0x02, 0x18, 0x4f, 0x0c, 0x01, + 0x0c, 0x18, 0x00, 0x00, 0x18, 0x0c, 0x03, 0x11, 0x14, 0x06, 0x11, 0x0a, 0x07, 0x0a, 0x00, 0x3f, + 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x5d, 0x10, 0xc5, 0xfd, 0xc5, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0x5d, 0xd6, 0x5d, 0xc0, 0xfd, 0x5d, 0x71, 0xc0, 0xd6, 0x5d, 0xed, 0x5d, 0xc0, 0x31, + 0x30, 0x25, 0x23, 0x35, 0x26, 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x17, 0x35, 0x33, 0x15, 0x32, + 0x36, 0x37, 0x35, 0x33, 0x11, 0x23, 0x35, 0x06, 0x06, 0x23, 0x01, 0x1d, 0x45, 0x53, 0x58, 0x7b, + 0x30, 0x45, 0x0a, 0x1f, 0x07, 0x7c, 0x7c, 0x07, 0x21, 0x08, 0x4a, 0x4b, 0x04, 0x4a, 0x5a, 0x99, + 0x98, 0x2f, 0x0c, 0x4b, 0x4e, 0x02, 0x02, 0xd2, 0xfe, 0x2a, 0x9a, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd0, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x3c, 0x40, 0x11, + 0x00, 0x44, 0x00, 0x15, 0x20, 0x15, 0x30, 0x15, 0x40, 0x15, 0x04, 0x15, 0x19, 0x08, 0x0d, 0x44, + 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x0e, 0x48, 0x0b, 0x18, 0x05, 0x4a, 0x10, 0x10, 0x0b, + 0x17, 0x08, 0x0b, 0x02, 0x09, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, + 0xd6, 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x23, + 0x01, 0x55, 0x0b, 0x18, 0x24, 0x18, 0x0d, 0x27, 0x11, 0x7b, 0x7b, 0x17, 0x2c, 0x14, 0x2c, 0x49, + 0x35, 0x1e, 0x7b, 0xb6, 0x25, 0x31, 0x1d, 0x0b, 0x04, 0x03, 0xfe, 0xd3, 0x02, 0x6b, 0xcf, 0x03, + 0x04, 0x15, 0x34, 0x59, 0x44, 0xbd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, + 0x02, 0xb6, 0x02, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xe4, + 0x02, 0x79, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x7c, 0xb9, 0x00, 0x2e, 0xff, 0xa0, 0x40, 0x28, 0x0b, + 0x0c, 0x00, 0x4c, 0x2a, 0x40, 0x0e, 0x00, 0x4d, 0x2a, 0x60, 0x0b, 0x0c, 0x00, 0x4c, 0x2f, 0x40, + 0x0b, 0x0c, 0x00, 0x4c, 0x29, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x29, 0x52, 0x28, 0x07, 0x31, 0xc0, + 0x1a, 0xd0, 0x1a, 0xe0, 0x1a, 0x03, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x23, 0x0b, 0x10, 0x48, 0x1a, + 0x52, 0x14, 0x30, 0x2f, 0x00, 0x52, 0x1d, 0x11, 0x30, 0x40, 0x2f, 0x01, 0x2f, 0x48, 0x00, 0x00, + 0x0c, 0x4f, 0x2c, 0x01, 0x2c, 0x4a, 0x20, 0x03, 0x17, 0x0b, 0x06, 0x03, 0x4a, 0x0c, 0x09, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xc5, + 0xfd, 0xc5, 0x10, 0xd6, 0xed, 0x2b, 0x5d, 0x10, 0xd6, 0xd6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x23, 0x22, + 0x2e, 0x02, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0xfd, 0x33, 0x3f, 0x1c, 0x30, 0x0b, 0x1e, 0x06, 0x1b, 0x22, 0x29, 0x15, 0x34, 0x4c, 0x33, 0x1b, + 0x02, 0x48, 0x42, 0x04, 0x05, 0x54, 0x07, 0x18, 0x1e, 0x0a, 0x55, 0x49, 0x33, 0x41, 0x25, 0x0d, + 0x02, 0x01, 0x64, 0x24, 0x1c, 0x20, 0x1d, 0x01, 0x13, 0x64, 0x5a, 0x15, 0x0b, 0x56, 0x06, 0x10, + 0x0d, 0x09, 0x2d, 0x4f, 0x6c, 0x3f, 0x0a, 0x51, 0x37, 0x0f, 0x1f, 0x0e, 0x0c, 0x12, 0x16, 0x17, + 0x27, 0x02, 0x7d, 0x88, 0x36, 0x53, 0x65, 0x2e, 0x14, 0x26, 0x10, 0x60, 0x58, 0x4c, 0x5a, 0x4a, + 0x00, 0x02, 0x00, 0x09, 0xff, 0xf5, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x80, + 0x40, 0x37, 0x29, 0x08, 0x0c, 0x00, 0x4d, 0x27, 0x40, 0x0c, 0x00, 0x4d, 0x11, 0x30, 0x0b, 0x00, + 0x4d, 0x2b, 0x26, 0x4b, 0x26, 0xcb, 0x26, 0xdb, 0x26, 0x04, 0x26, 0x53, 0xbb, 0x23, 0x01, 0x23, + 0x5b, 0x19, 0x01, 0x04, 0x19, 0x24, 0x19, 0x44, 0x19, 0x03, 0x19, 0x2e, 0x2c, 0x1a, 0x53, 0x10, + 0x03, 0x04, 0x0d, 0x14, 0x0d, 0x24, 0x0d, 0x03, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x0f, 0x13, + 0x48, 0x0d, 0x84, 0x06, 0x2d, 0x2c, 0x73, 0x1a, 0x1a, 0x00, 0x4d, 0x29, 0x01, 0x02, 0x29, 0x57, + 0x0f, 0x09, 0x01, 0x09, 0x13, 0x0b, 0x22, 0x1f, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xc4, 0x5d, 0xed, 0x5f, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x2b, 0x71, 0xd5, + 0xc5, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0x5d, 0xc6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x05, 0x22, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0x15, 0x14, 0x16, + 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x23, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x51, 0x5c, 0x66, + 0x06, 0x49, 0x37, 0x03, 0x05, 0x5c, 0x03, 0x02, 0x0f, 0x16, 0x0f, 0x58, 0x38, 0x51, 0x54, 0x01, + 0x01, 0xdc, 0x11, 0x1b, 0x23, 0x13, 0x17, 0x2b, 0x0e, 0x11, 0x16, 0x31, 0x07, 0x22, 0x18, 0x17, + 0x24, 0x0b, 0x6c, 0x6b, 0x0e, 0x49, 0x3f, 0x0b, 0x1b, 0x0f, 0x0e, 0x0b, 0x16, 0x09, 0x12, 0x1f, + 0x06, 0x5c, 0x5e, 0x7b, 0x76, 0x0c, 0x18, 0x0a, 0x1e, 0x29, 0x19, 0x0b, 0x0f, 0x08, 0x60, 0x0b, + 0x0f, 0x01, 0x23, 0x33, 0x35, 0x38, 0x30, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x7f, 0x01, 0xe4, + 0x02, 0x79, 0x00, 0x2b, 0x00, 0x32, 0x00, 0x69, 0x40, 0x41, 0x1a, 0x40, 0x09, 0x00, 0x4d, 0x2c, + 0x40, 0x0b, 0x00, 0x4d, 0x3f, 0x2c, 0x4f, 0x2c, 0x5f, 0x2c, 0x03, 0x2c, 0x53, 0x28, 0x07, 0x34, + 0x00, 0x20, 0x32, 0x30, 0x32, 0x02, 0x32, 0x53, 0x14, 0x20, 0x1d, 0x17, 0x33, 0x0d, 0x52, 0x0f, + 0x33, 0x20, 0x32, 0x55, 0x14, 0x00, 0x00, 0x0f, 0x20, 0x2f, 0x30, 0x2f, 0x02, 0x2f, 0x57, 0x23, + 0x03, 0x1a, 0x0b, 0x0e, 0x0f, 0x08, 0x06, 0x03, 0x57, 0x0c, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xc5, 0x3f, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xc5, 0xfd, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, + 0xd6, 0xd5, 0xde, 0xc5, 0xfd, 0x5d, 0xc5, 0x10, 0xd6, 0xd6, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x00, + 0x2b, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x07, 0x15, 0x23, 0x35, 0x2e, + 0x03, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0xfd, + 0x33, 0x3f, 0x1c, 0x30, 0x0b, 0x1e, 0x05, 0x15, 0x1b, 0x21, 0x12, 0x60, 0x22, 0x32, 0x21, 0x12, + 0x02, 0x48, 0x42, 0x04, 0x05, 0x54, 0x07, 0x18, 0x1e, 0x0a, 0x55, 0x49, 0x33, 0x41, 0x25, 0x0d, + 0x02, 0x01, 0x64, 0x24, 0x1c, 0x20, 0x1d, 0x01, 0x13, 0x64, 0x5a, 0x15, 0x0b, 0x56, 0x05, 0x0d, + 0x0c, 0x0a, 0x03, 0x75, 0x81, 0x0d, 0x35, 0x4a, 0x5b, 0x33, 0x0a, 0x51, 0x37, 0x0f, 0x1f, 0x0e, + 0x0c, 0x12, 0x16, 0x17, 0x27, 0x02, 0x7d, 0x88, 0x36, 0x53, 0x65, 0x2e, 0x14, 0x26, 0x10, 0x60, + 0x58, 0x4c, 0x5a, 0x4a, 0x00, 0x02, 0x00, 0x09, 0xff, 0x7f, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x28, + 0x00, 0x2f, 0x00, 0x72, 0x40, 0x49, 0x2f, 0x29, 0x3f, 0x29, 0x02, 0x29, 0x53, 0x5f, 0x19, 0x6f, + 0x19, 0x7f, 0x19, 0x03, 0x00, 0x19, 0x01, 0x19, 0x23, 0x40, 0x09, 0x10, 0x48, 0x23, 0x31, 0x1a, + 0x53, 0x03, 0x2f, 0x53, 0x00, 0x10, 0x01, 0x10, 0x0d, 0x06, 0x30, 0x27, 0x52, 0x00, 0x30, 0x22, + 0x1f, 0x57, 0x26, 0x40, 0x2f, 0x01, 0x2f, 0x55, 0x1a, 0x1a, 0x13, 0x26, 0x07, 0x4f, 0x2c, 0x5f, + 0x2c, 0x6f, 0x2c, 0x03, 0x2c, 0x57, 0x0f, 0x09, 0x01, 0x09, 0x13, 0x0b, 0x28, 0x00, 0x06, 0x00, + 0x3f, 0xc5, 0x3f, 0xc4, 0x5d, 0xed, 0x5d, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0xc6, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xd5, 0xde, 0x5d, 0xed, 0xd5, 0xed, 0x10, 0xc6, 0x2b, 0xd6, + 0x5d, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x05, 0x26, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, + 0x17, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, + 0x23, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x15, 0x23, 0x13, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x0a, 0x3b, 0x41, 0x05, 0x49, 0x37, 0x03, 0x05, 0x5c, 0x03, + 0x02, 0x0f, 0x16, 0x0f, 0x58, 0x38, 0x51, 0x54, 0x01, 0x01, 0xdc, 0x11, 0x1b, 0x23, 0x13, 0x17, + 0x2b, 0x0e, 0x11, 0x11, 0x25, 0x15, 0x61, 0x5e, 0x22, 0x18, 0x17, 0x24, 0x01, 0x12, 0x66, 0x55, + 0x0e, 0x49, 0x3f, 0x0b, 0x1b, 0x0f, 0x0e, 0x0b, 0x16, 0x09, 0x12, 0x1f, 0x06, 0x5c, 0x5e, 0x7b, + 0x76, 0x0c, 0x1b, 0x07, 0x1e, 0x29, 0x19, 0x0b, 0x0f, 0x08, 0x60, 0x08, 0x0d, 0x03, 0x78, 0x01, + 0x99, 0x33, 0x35, 0x38, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x39, 0x02, 0x26, 0x02, 0xc9, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x33, 0x3b, 0x25, 0x0e, 0x50, 0x01, 0x00, 0x2e, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, 0x02, 0xae, 0x02, 0x26, + 0x02, 0xe9, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, + 0x31, 0x39, 0x23, 0x06, 0x50, 0x01, 0x05, 0x2c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x59, 0x01, 0xef, 0x02, 0x6b, 0x00, 0x25, 0x00, 0x54, 0x40, 0x30, 0x21, 0x46, 0x14, 0x27, + 0x11, 0x0b, 0x0c, 0x0c, 0x26, 0x27, 0x03, 0x08, 0x44, 0x06, 0x4f, 0x1a, 0x01, 0x1a, 0x26, 0x1b, + 0x40, 0x1e, 0x50, 0x1e, 0x60, 0x1e, 0x03, 0x1e, 0x4a, 0x17, 0x0e, 0x0b, 0x02, 0x11, 0x4a, 0x00, + 0x08, 0x00, 0x03, 0x03, 0x00, 0x08, 0x03, 0x04, 0x07, 0x02, 0x04, 0x08, 0x00, 0x3f, 0x3f, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x10, 0xed, 0x3f, 0x3f, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xc6, 0x5d, + 0xd6, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x22, + 0x06, 0x07, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, + 0x02, 0xdd, 0x0d, 0x1a, 0x0e, 0x7b, 0x7b, 0x32, 0x62, 0x27, 0x8c, 0x0e, 0x2d, 0x39, 0x41, 0x22, + 0x5b, 0x6b, 0x72, 0x76, 0x0d, 0x1c, 0x0e, 0x05, 0x09, 0x11, 0x08, 0x42, 0x43, 0x14, 0x24, 0x35, + 0x01, 0x02, 0x02, 0x02, 0xfe, 0x02, 0x6b, 0xee, 0x3a, 0x7b, 0x39, 0x15, 0x3c, 0x46, 0x4b, 0x24, + 0x0b, 0x7c, 0x7b, 0x7f, 0x8b, 0x02, 0x02, 0x65, 0x01, 0x47, 0x57, 0x2f, 0x3f, 0x25, 0x10, 0x00, + 0x00, 0x01, 0x00, 0x3f, 0xff, 0x59, 0x01, 0xde, 0x01, 0xd6, 0x00, 0x25, 0x00, 0x55, 0x40, 0x33, + 0x19, 0x53, 0x00, 0x0c, 0x60, 0x0c, 0x02, 0x0c, 0x27, 0x09, 0x03, 0x04, 0x04, 0x26, 0x27, 0x21, + 0x00, 0x51, 0x00, 0x24, 0x01, 0x24, 0x00, 0x12, 0x01, 0x12, 0x26, 0x25, 0x0a, 0x09, 0x57, 0x00, + 0x55, 0x1e, 0x1e, 0x03, 0x22, 0x06, 0x40, 0x16, 0x50, 0x16, 0x60, 0x16, 0x03, 0x16, 0x57, 0x0f, + 0x0e, 0x03, 0x0a, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0xed, 0x3f, 0x01, + 0x10, 0xc6, 0x5d, 0xd6, 0x5d, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x10, 0xd6, 0x5d, + 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x15, 0x23, 0x11, 0x33, 0xbb, 0x26, 0x4e, 0x1b, 0x94, 0x10, 0x2a, 0x30, 0x32, 0x18, + 0x51, 0x5a, 0x6b, 0x6f, 0x0c, 0x19, 0x0e, 0x04, 0x08, 0x10, 0x08, 0x3b, 0x3c, 0x14, 0x25, 0x34, + 0x21, 0x07, 0x0c, 0x07, 0x7c, 0x7c, 0x01, 0x2e, 0x27, 0x5b, 0x26, 0x14, 0x2e, 0x30, 0x2f, 0x15, + 0x0b, 0x6c, 0x67, 0x6f, 0x7a, 0x02, 0x02, 0x65, 0x01, 0x38, 0x45, 0x25, 0x32, 0x1e, 0x0c, 0x01, + 0x01, 0xbd, 0x01, 0xcf, 0x00, 0x01, 0x00, 0x08, 0xff, 0x57, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x1d, + 0x00, 0x4b, 0x40, 0x2e, 0x30, 0x16, 0x01, 0x13, 0x14, 0x14, 0x0b, 0x20, 0x0a, 0x30, 0x0a, 0x02, + 0x0a, 0x44, 0x30, 0x15, 0x01, 0x15, 0x20, 0x16, 0x40, 0x16, 0x50, 0x16, 0x03, 0x16, 0x44, 0x08, + 0x00, 0x10, 0x1e, 0x00, 0x4a, 0x1d, 0x09, 0x0a, 0x14, 0x08, 0x0f, 0x92, 0x15, 0x48, 0x09, 0x02, + 0x08, 0x02, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xcc, 0xd6, 0xd6, + 0xfd, 0x5d, 0xde, 0x5d, 0xfd, 0x5d, 0xcd, 0x33, 0x2f, 0xcd, 0x5d, 0x31, 0x30, 0x37, 0x3e, 0x03, + 0x37, 0x36, 0x36, 0x35, 0x21, 0x11, 0x33, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, + 0x11, 0x23, 0x0e, 0x05, 0x07, 0x08, 0x1a, 0x24, 0x18, 0x10, 0x06, 0x11, 0x0e, 0x01, 0x23, 0x23, + 0x3a, 0x3c, 0x4a, 0x18, 0x24, 0x0b, 0x26, 0x36, 0x02, 0x07, 0x11, 0x1e, 0x34, 0x4b, 0x36, 0x5d, + 0x09, 0x19, 0x21, 0x29, 0x19, 0x42, 0xc7, 0x80, 0xfe, 0x0b, 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, + 0x3d, 0x1d, 0x02, 0x05, 0x3a, 0x7a, 0x72, 0x67, 0x4f, 0x32, 0x04, 0x00, 0x00, 0x01, 0x00, 0x11, + 0xff, 0x6c, 0x01, 0xdc, 0x01, 0xd6, 0x00, 0x1d, 0x00, 0x42, 0x40, 0x27, 0x1b, 0x20, 0x1c, 0x30, + 0x1c, 0x02, 0x1c, 0x1c, 0x14, 0x13, 0x51, 0x1d, 0x20, 0x00, 0x30, 0x00, 0x50, 0x00, 0x03, 0x00, + 0x52, 0x11, 0x08, 0x18, 0x1e, 0x1c, 0x06, 0x17, 0x13, 0x1b, 0x06, 0x00, 0x55, 0x11, 0x0a, 0x08, + 0x57, 0x07, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0xc5, 0x3f, 0x01, 0x10, 0xc6, 0xd6, + 0xd6, 0xfd, 0x5d, 0xde, 0xfd, 0xcd, 0x33, 0x2f, 0x5d, 0xcd, 0x31, 0x30, 0x13, 0x0e, 0x05, 0x07, + 0x27, 0x36, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x35, 0x21, 0x11, 0x33, 0x16, 0x06, 0x07, 0x27, 0x36, + 0x36, 0x37, 0x23, 0x11, 0xf0, 0x02, 0x05, 0x0d, 0x1a, 0x2d, 0x43, 0x30, 0x11, 0x23, 0x22, 0x0b, + 0x0c, 0x0d, 0x07, 0x01, 0x01, 0x34, 0x24, 0x02, 0x3e, 0x33, 0x4a, 0x12, 0x22, 0x0b, 0x25, 0x01, + 0x70, 0x2b, 0x57, 0x52, 0x48, 0x37, 0x22, 0x03, 0x66, 0x08, 0x22, 0x15, 0x18, 0x3f, 0x46, 0x47, + 0x1f, 0x36, 0xfe, 0x97, 0x4b, 0x89, 0x2d, 0x2e, 0x16, 0x37, 0x19, 0x01, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x52, 0x40, 0x16, + 0x0f, 0x30, 0x00, 0x01, 0x00, 0x44, 0x0f, 0x16, 0xbf, 0x16, 0x02, 0x16, 0x10, 0x20, 0x15, 0x01, + 0x15, 0x44, 0x70, 0x13, 0x01, 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x0b, 0x0e, 0x48, 0x13, 0x07, + 0x18, 0x17, 0x02, 0x15, 0x48, 0x40, 0x10, 0x01, 0x10, 0x10, 0x11, 0x14, 0x02, 0x11, 0x08, 0x08, + 0x0b, 0x4a, 0x04, 0x92, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, + 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0x5d, 0xfd, 0x5d, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x33, 0x31, 0x30, + 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, + 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0xc7, 0x5a, 0x55, 0x0d, 0x31, 0x16, 0x12, + 0x0e, 0x16, 0x11, 0x23, 0x1e, 0xa4, 0x7b, 0x7b, 0xa4, 0x02, 0x6b, 0xfd, 0xa6, 0x5d, 0x59, 0x04, + 0x08, 0x67, 0x04, 0x04, 0x27, 0x20, 0x01, 0x04, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3b, 0xff, 0x5b, 0x01, 0xb8, 0x01, 0xd6, 0x00, 0x17, 0x00, 0x4c, 0x40, 0x0e, + 0x20, 0x17, 0x01, 0x17, 0x51, 0x0e, 0x30, 0x15, 0x01, 0x15, 0x0f, 0x14, 0x51, 0x11, 0xb8, 0xff, + 0xc0, 0x40, 0x1c, 0x0a, 0x0f, 0x48, 0x11, 0x4f, 0x06, 0x01, 0x10, 0x06, 0x01, 0x06, 0x18, 0x16, + 0x0a, 0x14, 0x55, 0x0f, 0x0f, 0x10, 0x13, 0x0a, 0x10, 0x06, 0x07, 0x0a, 0x57, 0x03, 0x0e, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, + 0x2b, 0xfd, 0xc0, 0xd6, 0x5d, 0xc0, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, + 0x35, 0x33, 0x01, 0xb8, 0x5a, 0x56, 0x0c, 0x31, 0x16, 0x12, 0x0e, 0x16, 0x11, 0x23, 0x1e, 0x87, + 0x7b, 0x7b, 0x87, 0x7b, 0x11, 0x5d, 0x59, 0x04, 0x08, 0x67, 0x04, 0x04, 0x27, 0x20, 0xad, 0xba, + 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x57, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x14, + 0x00, 0x68, 0x40, 0x29, 0x14, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x13, 0x40, 0x0b, 0x0c, 0x00, 0x4c, + 0x0c, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x0b, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x0a, 0x0b, 0x0b, 0x13, + 0x02, 0x01, 0x44, 0x20, 0x13, 0x30, 0x13, 0x02, 0x13, 0x0d, 0x12, 0x44, 0x10, 0xb8, 0xff, 0xc0, + 0x40, 0x18, 0x0b, 0x0e, 0x48, 0x10, 0x07, 0x15, 0x14, 0x02, 0x11, 0x02, 0x13, 0x48, 0x40, 0x0d, + 0x01, 0x0d, 0x0e, 0x08, 0x02, 0x0b, 0x08, 0x07, 0x06, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x3f, + 0xdd, 0x5d, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0xfd, 0xc0, 0xd6, 0x5d, 0xfd, 0xcd, + 0x11, 0x33, 0x10, 0xcd, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x11, 0x33, 0x15, 0x14, 0x06, + 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, + 0xb6, 0x23, 0x3a, 0x3c, 0x4a, 0x18, 0x24, 0x0b, 0x26, 0x92, 0x7b, 0x7b, 0x92, 0x02, 0x6b, 0xfe, + 0x0b, 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, 0x3d, 0x1d, 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, + 0xf4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0x6c, 0x01, 0xdc, 0x01, 0xd6, 0x00, 0x13, + 0x00, 0x68, 0x40, 0x26, 0x12, 0x40, 0x0c, 0x00, 0x4d, 0x11, 0x40, 0x0c, 0x00, 0x4d, 0x0a, 0x40, + 0x0c, 0x00, 0x4d, 0x09, 0x40, 0x0c, 0x00, 0x4d, 0x08, 0x09, 0x0a, 0x01, 0x00, 0x51, 0x0a, 0x30, + 0x11, 0x01, 0x11, 0x10, 0x0b, 0x51, 0x70, 0x0d, 0x01, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, + 0x0e, 0x48, 0x0d, 0x14, 0x04, 0x05, 0x14, 0x13, 0x0a, 0x0f, 0x0a, 0x11, 0x55, 0x0b, 0x0c, 0x06, + 0x05, 0x04, 0x09, 0x06, 0x00, 0x08, 0x06, 0x00, 0x3f, 0xc5, 0x3f, 0xd4, 0xc5, 0x3f, 0xd5, 0xed, + 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd0, 0xd6, 0x5d, 0xd0, 0xfd, + 0xcd, 0x10, 0xd0, 0xcd, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x33, 0x16, 0x06, 0x07, 0x27, + 0x36, 0x36, 0x37, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x01, 0xb6, + 0x24, 0x02, 0x3e, 0x33, 0x4a, 0x12, 0x22, 0x0b, 0x25, 0x85, 0x7b, 0x7b, 0x85, 0x7b, 0x6d, 0x4b, + 0x89, 0x2d, 0x2e, 0x16, 0x37, 0x19, 0xba, 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x4b, 0x40, 0x2d, 0x00, 0x19, 0x01, 0x00, + 0x18, 0x01, 0x1b, 0x01, 0x15, 0x44, 0x00, 0x16, 0x01, 0x16, 0x20, 0x18, 0x30, 0x18, 0x02, 0x18, + 0x1d, 0x0b, 0x44, 0x20, 0x0a, 0x30, 0x0a, 0x02, 0x0a, 0x1c, 0x1a, 0x12, 0x11, 0x4a, 0x04, 0x1b, + 0x04, 0x1b, 0x15, 0x18, 0x08, 0x15, 0x02, 0x0b, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xc4, 0x5d, 0xd6, 0x5d, 0xfd, 0xd0, + 0xce, 0x31, 0x30, 0x5d, 0x5d, 0x25, 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, + 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x15, 0x23, 0x11, 0x01, + 0x4c, 0x17, 0x2c, 0x14, 0x2c, 0x49, 0x35, 0x1e, 0x7b, 0x0b, 0x18, 0x24, 0x18, 0x0d, 0x27, 0x11, + 0x7b, 0x4c, 0x73, 0x66, 0x69, 0x03, 0x04, 0x14, 0x34, 0x59, 0x45, 0xbd, 0xb6, 0x26, 0x30, 0x1d, + 0x0b, 0x03, 0x04, 0x01, 0x2d, 0xfd, 0x95, 0xa5, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2b, + 0xff, 0x7a, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x50, 0xb9, 0x00, 0x0e, 0xff, 0xc0, 0xb4, + 0x09, 0x0a, 0x00, 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x09, 0x0a, 0x00, 0x4c, 0x10, 0x40, + 0x11, 0x14, 0x48, 0x10, 0x0d, 0x11, 0x09, 0x51, 0x0b, 0x0c, 0x1c, 0x01, 0x51, 0x30, 0x19, 0x01, + 0x19, 0x1b, 0x06, 0x57, 0x14, 0x11, 0x11, 0x0a, 0x0e, 0x0d, 0x06, 0x0a, 0x0a, 0x00, 0x0a, 0x00, + 0x3f, 0x3f, 0x3f, 0xc5, 0x12, 0x39, 0x2f, 0xde, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xc6, + 0xd6, 0xfd, 0xd0, 0xcd, 0xc5, 0x2b, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x37, 0x35, 0x33, 0x11, 0x23, 0x15, 0x23, 0x35, 0x33, 0x35, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x35, 0xa6, 0x10, 0x1b, 0x21, 0x11, 0x10, 0x1c, 0x0b, 0x7c, 0x62, 0x72, 0x58, 0x2a, + 0x27, 0x27, 0x45, 0x34, 0x1e, 0x01, 0xd6, 0x95, 0x13, 0x18, 0x0e, 0x05, 0x02, 0x02, 0xcf, 0xfe, + 0x2a, 0x86, 0xec, 0x34, 0x06, 0x0f, 0x27, 0x41, 0x32, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, + 0xff, 0x57, 0x01, 0xec, 0x02, 0x6b, 0x00, 0x23, 0x00, 0x9b, 0xb9, 0x00, 0x1d, 0xff, 0xe0, 0x40, + 0x5e, 0x16, 0x17, 0x00, 0x4c, 0x1c, 0x20, 0x18, 0x1a, 0x00, 0x4c, 0x1b, 0x30, 0x18, 0x00, 0x4d, + 0x6f, 0x18, 0x8f, 0x18, 0x02, 0x18, 0x0e, 0x40, 0x09, 0x0c, 0x48, 0x0e, 0x7f, 0x0f, 0x01, 0x0f, + 0x25, 0x0a, 0x0a, 0x0b, 0x40, 0x09, 0x0c, 0x48, 0x0b, 0x25, 0x1c, 0x1b, 0x24, 0x1a, 0x19, 0x25, + 0x05, 0x05, 0x24, 0x25, 0x00, 0x00, 0x0b, 0x23, 0x1b, 0x23, 0x02, 0xf8, 0x23, 0x01, 0x23, 0x24, + 0x1d, 0xb3, 0x1e, 0x20, 0x12, 0x15, 0x48, 0x1e, 0x14, 0x24, 0x05, 0x1c, 0x19, 0x03, 0x1a, 0x1b, + 0x0e, 0x0e, 0x1b, 0x1a, 0x03, 0x1d, 0x08, 0x18, 0x08, 0x13, 0x92, 0x0a, 0x02, 0x00, 0x02, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x17, 0x39, 0x01, 0x10, 0xc6, 0xd6, + 0x2b, 0xed, 0x10, 0xd0, 0x5d, 0x71, 0xc1, 0x2f, 0x11, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, + 0x12, 0x39, 0x39, 0x10, 0xd0, 0x2b, 0xc1, 0x18, 0x2f, 0x10, 0xd6, 0x5d, 0xdd, 0x2b, 0xcd, 0x5d, + 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x13, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x16, 0x16, 0x17, + 0x33, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, + 0x3e, 0x03, 0x37, 0xa1, 0x07, 0x12, 0x15, 0x15, 0x0b, 0x0c, 0x17, 0x15, 0x12, 0x08, 0x65, 0x0c, + 0x12, 0x04, 0x24, 0x3b, 0x3c, 0x49, 0x18, 0x24, 0x0b, 0x13, 0x43, 0x59, 0x3c, 0x71, 0x03, 0x07, + 0x08, 0x0b, 0x07, 0x02, 0x6b, 0x15, 0x42, 0x4c, 0x4e, 0x21, 0x25, 0x4f, 0x49, 0x40, 0x15, 0x84, + 0xf4, 0x7d, 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, 0x3d, 0x1d, 0x01, 0xe1, 0xfe, 0xfa, 0x01, 0x06, + 0xfe, 0x1f, 0x4c, 0xa4, 0xa2, 0x98, 0x41, 0x00, 0x00, 0x01, 0x00, 0x18, 0xff, 0x6c, 0x01, 0xec, + 0x01, 0xd6, 0x00, 0x22, 0x00, 0x5e, 0x40, 0x32, 0x17, 0x16, 0x0e, 0x0f, 0x24, 0x0a, 0x0b, 0x24, + 0x1b, 0x1a, 0x19, 0x18, 0x05, 0x18, 0x19, 0x05, 0x1a, 0x1b, 0x05, 0x23, 0x24, 0x00, 0x22, 0xe4, + 0x1c, 0xf4, 0x1c, 0x02, 0x1c, 0x1d, 0x13, 0x23, 0x22, 0x0a, 0x1c, 0x06, 0x05, 0x18, 0x1b, 0x03, + 0x0e, 0x1a, 0x0e, 0x1a, 0x0a, 0x12, 0x17, 0x06, 0x0a, 0x0a, 0x00, 0x3f, 0x3f, 0xc4, 0x12, 0x39, + 0x39, 0x2f, 0x2f, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0xc5, 0x5d, 0xd5, 0xc5, 0x11, + 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0xd5, + 0xd5, 0xc5, 0x31, 0x30, 0x13, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x16, 0x16, 0x17, 0x33, + 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x3e, 0x03, + 0x37, 0xab, 0x06, 0x0f, 0x12, 0x13, 0x09, 0x0a, 0x16, 0x14, 0x11, 0x06, 0x6e, 0x0b, 0x10, 0x05, + 0x25, 0x3c, 0x34, 0x49, 0x11, 0x23, 0x0b, 0x11, 0x45, 0x59, 0x3a, 0x71, 0x03, 0x07, 0x08, 0x0b, + 0x07, 0x01, 0xd6, 0x19, 0x48, 0x53, 0x58, 0x28, 0x28, 0x59, 0x53, 0x48, 0x18, 0x60, 0xae, 0x5b, + 0x4c, 0x88, 0x2d, 0x2e, 0x16, 0x37, 0x19, 0x01, 0x4c, 0xfe, 0xf3, 0x01, 0x0d, 0xfe, 0xb4, 0x3a, + 0x7c, 0x7b, 0x74, 0x31, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x2d, 0x40, 0x17, 0x0b, 0x09, 0x07, 0x08, 0x51, 0x02, 0x03, 0x04, 0x30, 0x01, 0x01, 0x01, + 0x0c, 0x08, 0x03, 0x48, 0x05, 0x04, 0x09, 0x02, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, + 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0xd0, 0xd5, 0xc0, 0xfd, 0xc5, 0xd0, 0xc5, 0x31, 0x30, 0x33, + 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x87, 0x87, 0x01, 0x89, + 0x86, 0x86, 0x66, 0x01, 0x9f, 0x66, 0x66, 0xfe, 0x61, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x39, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x1c, 0x24, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0xae, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x08, 0x34, 0x3c, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x19, + 0x2b, 0x04, 0x0b, 0x50, 0x03, 0x07, 0x23, 0x4f, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa1, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, + 0x09, 0x31, 0x43, 0x1c, 0x13, 0x50, 0x03, 0x0f, 0x3b, 0x4f, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0xa1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, 0x01, 0xe2, 0x02, 0x06, + 0x00, 0xc1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x39, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, 0x00, 0x1b, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x10, 0x11, 0x19, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xae, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x01, 0x06, 0x03, 0x90, 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0b, 0x2b, 0x33, 0x00, 0x07, + 0x50, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xd5, + 0x02, 0x79, 0x02, 0x06, 0x01, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x01, 0xe2, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x4d, 0x40, 0x30, 0x23, 0x0c, 0x53, 0x00, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x03, 0x00, 0x25, 0x1b, 0x53, 0x13, 0x70, 0x08, 0x01, 0x08, 0x24, 0x12, 0x4f, + 0x0f, 0x01, 0x0f, 0x57, 0x16, 0x4f, 0x23, 0x5f, 0x23, 0x6f, 0x23, 0x03, 0x23, 0x55, 0x0c, 0x0c, + 0x05, 0x16, 0x0b, 0x3f, 0x20, 0x01, 0x20, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x12, + 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, + 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, + 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x05, 0x14, + 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd1, 0x26, 0x3d, 0x50, 0x2a, 0x69, 0x6c, 0x01, 0x02, + 0x01, 0x30, 0x4b, 0x3c, 0x25, 0x44, 0x16, 0x12, 0x20, 0x48, 0x2d, 0x3c, 0x5f, 0x43, 0x24, 0xfe, + 0xc5, 0x0a, 0x16, 0x23, 0x19, 0x2f, 0x2d, 0x04, 0xf0, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, 0x76, 0x0c, + 0x19, 0x0a, 0x2e, 0x34, 0x0f, 0x08, 0x68, 0x0c, 0x0e, 0x1f, 0x3d, 0x5a, 0x6d, 0x12, 0x24, 0x1b, + 0x11, 0x3b, 0x27, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x2c, 0x02, 0x26, + 0x01, 0xe8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0xff, 0xef, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x03, + 0x02, 0xb8, 0xff, 0xf4, 0x40, 0x0d, 0x2a, 0x3c, 0x1a, 0x12, 0x50, 0x03, 0x0d, 0x34, 0x4f, 0x02, + 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x02, 0xa1, 0x02, 0x26, 0x03, 0x69, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xf8, 0x00, 0x00, 0x1a, + 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xfc, 0x40, 0x0d, 0x26, 0x38, 0x07, 0x00, 0x50, 0x03, 0x15, 0x30, + 0x4f, 0x02, 0x15, 0x24, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xc9, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x30, 0x42, 0x25, 0x0e, 0x50, + 0x02, 0x00, 0x3a, 0x4f, 0x01, 0x00, 0x2e, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, 0x02, 0xa1, 0x02, 0x26, 0x02, 0xe9, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x2e, 0x40, 0x23, + 0x06, 0x50, 0x02, 0x05, 0x38, 0x4f, 0x01, 0x05, 0x2c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x17, 0xff, 0xf3, 0x01, 0xdf, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xca, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x00, 0x35, + 0x47, 0x23, 0x1a, 0x50, 0x02, 0x0f, 0x3f, 0x4f, 0x01, 0x0f, 0x33, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xb3, 0x02, 0xa1, 0x02, 0x26, + 0x02, 0xea, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xf8, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x00, 0x33, 0x45, 0x16, 0x0d, 0x50, 0x02, 0x02, 0x3d, 0x4f, 0x01, 0x02, 0x31, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1a, 0xff, 0xf3, 0x01, 0xe1, 0x02, 0x6b, 0x02, 0x06, + 0x02, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0x5b, 0x01, 0xba, 0x01, 0xd6, 0x02, 0x06, + 0x02, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x12, 0x02, 0x26, + 0x02, 0xcb, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x02, 0x10, 0x11, 0x00, 0x09, 0x50, 0x01, 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, 0x02, 0x87, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x10, 0x11, 0x00, 0x07, + 0x50, 0x01, 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x2c, 0x02, 0x26, 0x02, 0xcb, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x12, 0x24, 0x00, 0x09, 0x50, 0x02, 0x01, 0x1c, 0x4f, + 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb6, 0x02, 0xa1, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x12, 0x24, 0x00, 0x07, 0x50, 0x02, 0x01, + 0x1c, 0x4f, 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x14, 0x19, 0x50, + 0x03, 0x16, 0x2c, 0x4f, 0x02, 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x2c, 0x4f, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x03, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x21, + 0x00, 0x35, 0x40, 0x1e, 0x1c, 0x12, 0x46, 0x00, 0x06, 0x40, 0x06, 0x60, 0x06, 0x03, 0x06, 0x23, + 0x1d, 0x11, 0x46, 0x00, 0x22, 0x12, 0x48, 0x1c, 0x1c, 0x03, 0x17, 0x4a, 0x09, 0x09, 0x0c, 0x4a, + 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc0, + 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x13, 0x22, 0x0e, 0x02, 0x07, 0x33, 0x2e, 0x03, 0x03, 0x32, 0x3e, 0x02, 0x37, + 0x23, 0x1e, 0x03, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0xdf, 0x1b, 0x24, 0x16, + 0x0b, 0x01, 0xc2, 0x02, 0x0a, 0x16, 0x24, 0x1b, 0x1b, 0x23, 0x16, 0x0a, 0x02, 0xc1, 0x01, 0x0b, + 0x16, 0x24, 0x01, 0x36, 0xa0, 0xa3, 0xa3, 0xa0, 0xa0, 0xa3, 0xa3, 0x01, 0x78, 0x1a, 0x2d, 0x3d, + 0x24, 0x24, 0x3e, 0x2d, 0x19, 0xfe, 0x50, 0x19, 0x2c, 0x3d, 0x24, 0x24, 0x3d, 0x2c, 0x19, 0x00, + 0x00, 0x03, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x01, 0xe2, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x21, + 0x00, 0x41, 0x40, 0x28, 0x17, 0x1f, 0x53, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x80, + 0x00, 0x05, 0x00, 0x23, 0x18, 0x1e, 0x53, 0x80, 0x0a, 0x01, 0x0a, 0x22, 0x1f, 0x73, 0x17, 0x17, + 0x05, 0x4f, 0x1b, 0x01, 0x1b, 0x57, 0x0f, 0x0b, 0x14, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xfd, + 0xc0, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x07, 0x32, 0x36, 0x37, 0x23, 0x16, 0x16, 0x13, 0x22, 0x06, 0x07, 0x33, 0x26, + 0x26, 0x01, 0xd8, 0x20, 0x3a, 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, 0x31, + 0x51, 0x3b, 0x20, 0xdf, 0x28, 0x2f, 0x08, 0xbd, 0x07, 0x2d, 0x2c, 0x28, 0x2f, 0x08, 0xbc, 0x07, + 0x2d, 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, 0x42, 0x5b, 0x38, 0x37, 0x5b, 0x41, 0x23, 0x23, 0x41, + 0x5b, 0xc5, 0x36, 0x30, 0x30, 0x36, 0x01, 0x19, 0x35, 0x2e, 0x2e, 0x35, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2c, 0x02, 0x26, 0x03, 0x78, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x01, 0x24, 0x36, 0x00, 0x05, 0x50, + 0x04, 0x02, 0x2e, 0x4f, 0x03, 0x02, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x03, 0x79, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x01, 0x24, 0x36, 0x09, + 0x00, 0x50, 0x04, 0x0e, 0x2e, 0x4f, 0x03, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xe4, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xe0, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0xff, 0xf8, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xed, + 0x40, 0x0d, 0x27, 0x39, 0x03, 0x1f, 0x50, 0x02, 0x1a, 0x31, 0x4f, 0x01, 0x1a, 0x25, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x18, 0xff, 0xf5, 0x01, 0xcb, 0x02, 0xa1, 0x02, 0x26, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xf8, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x02, 0x25, 0x37, 0x08, 0x00, 0x50, 0x02, 0x1d, 0x2f, 0x4f, 0x01, 0x1d, 0x23, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, 0x03, 0x12, 0x02, 0x26, + 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x02, 0x21, 0x22, 0x17, 0x00, 0x50, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x06, 0x23, 0x24, 0x0d, 0x00, + 0x50, 0x01, 0x00, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, + 0x03, 0x2c, 0x02, 0x26, 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x02, 0x23, 0x35, 0x17, 0x00, 0x50, 0x02, 0x00, 0x2d, 0x4f, + 0x01, 0x00, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, + 0xff, 0x58, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x09, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x0e, 0x25, 0x37, 0x0d, 0x00, 0x50, 0x02, 0x00, + 0x2f, 0x4f, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x05, + 0xff, 0xf3, 0x01, 0xee, 0x03, 0x3f, 0x02, 0x26, 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x01, 0x65, + 0x00, 0x24, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x27, 0x23, 0x25, 0x17, 0x00, 0x50, + 0x02, 0x00, 0x26, 0x4f, 0x01, 0x00, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xda, 0x02, 0xb4, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x65, 0x24, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x2a, 0x25, 0x27, 0x0d, + 0x00, 0x50, 0x02, 0x00, 0x28, 0x4f, 0x01, 0x00, 0x24, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xda, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1a, + 0x2c, 0x14, 0x0a, 0x50, 0x02, 0x09, 0x24, 0x4f, 0x01, 0x09, 0x18, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2b, 0x00, 0x00, 0x01, 0xb6, 0x02, 0xa1, 0x02, 0x26, + 0x02, 0xfa, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x0b, 0x19, 0x2b, 0x14, 0x0b, 0x50, 0x02, 0x00, 0x23, 0x4f, 0x01, 0x00, 0x17, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0x7a, 0x01, 0xe4, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x4a, 0x40, 0x2f, 0x08, 0x40, 0x1e, 0x00, 0x4d, 0x20, 0x08, 0x30, 0x08, 0x40, 0x08, 0x03, + 0x08, 0xb3, 0x5f, 0x06, 0x9f, 0x06, 0xdf, 0x06, 0x03, 0x06, 0x0d, 0x3f, 0x03, 0x01, 0x03, 0x01, + 0x0b, 0x05, 0x51, 0x00, 0x80, 0x0b, 0x01, 0x0b, 0x0c, 0x00, 0x05, 0x72, 0x07, 0x09, 0x08, 0x04, + 0x72, 0x01, 0x02, 0x00, 0x3f, 0xed, 0x3f, 0xc5, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x5d, 0xd5, 0xed, + 0x10, 0xd6, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x37, 0x11, 0x21, 0x15, + 0x23, 0x11, 0x33, 0x15, 0x23, 0x35, 0x23, 0x35, 0x7d, 0x01, 0x67, 0xec, 0x87, 0x72, 0xe9, 0x66, + 0x02, 0x05, 0x66, 0xfe, 0x61, 0xec, 0x86, 0x66, 0x00, 0x01, 0x00, 0x59, 0xff, 0x7a, 0x01, 0xbf, + 0x01, 0xd6, 0x00, 0x09, 0x00, 0x2d, 0x40, 0x19, 0x07, 0x08, 0x51, 0x05, 0x0a, 0x2f, 0x01, 0x3f, + 0x01, 0x4f, 0x01, 0x03, 0x01, 0x03, 0x04, 0x0a, 0x07, 0x48, 0x05, 0x0a, 0x02, 0x00, 0x48, 0x04, + 0x06, 0x00, 0x3f, 0xed, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0xc5, 0x5d, 0x10, 0xd6, 0xfd, + 0xc5, 0x31, 0x30, 0x25, 0x15, 0x23, 0x35, 0x23, 0x11, 0x21, 0x15, 0x23, 0x11, 0x01, 0x2d, 0x72, + 0x62, 0x01, 0x66, 0xea, 0x66, 0xec, 0x86, 0x01, 0xd6, 0x66, 0xfe, 0xf6, 0xff, 0xff, 0x00, 0x22, + 0xff, 0xf8, 0x01, 0xcf, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xde, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x03, 0x20, 0x32, 0x08, 0x1a, 0x50, + 0x04, 0x09, 0x2a, 0x4f, 0x03, 0x09, 0x1e, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x22, 0xff, 0xf6, 0x01, 0xcf, 0x02, 0xa1, 0x02, 0x26, 0x02, 0xfe, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x03, 0x26, 0x38, 0x10, + 0x14, 0x50, 0x04, 0x11, 0x30, 0x4f, 0x03, 0x11, 0x24, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x19, + 0x00, 0x25, 0x00, 0xca, 0x40, 0x36, 0x0f, 0x1a, 0x1f, 0x1a, 0x02, 0x13, 0x0f, 0x1a, 0x1f, 0x1a, + 0x02, 0x3f, 0x1a, 0x01, 0x7f, 0x1a, 0x8f, 0x1a, 0x9f, 0x1a, 0x03, 0x1a, 0x7c, 0x00, 0x14, 0x10, + 0x14, 0x20, 0x14, 0x40, 0x14, 0x60, 0x14, 0x05, 0x19, 0x14, 0x27, 0x00, 0x20, 0x10, 0x20, 0x02, + 0x39, 0x30, 0x20, 0x01, 0x70, 0x20, 0x80, 0x20, 0x90, 0x20, 0x03, 0x20, 0xb8, 0xff, 0xc0, 0x40, + 0x5b, 0x13, 0x16, 0x48, 0x20, 0x7c, 0x0e, 0x08, 0x50, 0x0b, 0x60, 0x0b, 0x70, 0x0b, 0x03, 0x00, + 0x0b, 0x10, 0x0b, 0x90, 0x0b, 0xa0, 0x0b, 0xb0, 0x0b, 0x05, 0x0b, 0x0a, 0x2f, 0x08, 0x4f, 0x08, + 0x02, 0x90, 0x08, 0x01, 0x6f, 0x08, 0x7f, 0x08, 0x8f, 0x08, 0x03, 0x08, 0x8f, 0x8f, 0x07, 0x01, + 0x07, 0x01, 0x8f, 0x40, 0x03, 0x60, 0x03, 0x80, 0x03, 0x90, 0x03, 0x04, 0x03, 0x26, 0x23, 0x80, + 0x2f, 0x17, 0x5f, 0x17, 0x02, 0x17, 0xa1, 0x1d, 0x80, 0x11, 0x03, 0x0c, 0x55, 0x10, 0x0b, 0x01, + 0x0b, 0x8c, 0x01, 0x06, 0x07, 0x02, 0x05, 0x02, 0x02, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x39, 0x39, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0xed, 0x01, 0x10, 0xd6, 0x71, 0xfd, + 0xd4, 0x5d, 0xfd, 0x5d, 0x5d, 0x71, 0xde, 0xc5, 0x5d, 0x71, 0x10, 0xde, 0xed, 0x2b, 0x71, 0x72, + 0x5e, 0x5d, 0x10, 0xd6, 0x5e, 0x5d, 0xed, 0x5d, 0x71, 0x72, 0x31, 0x30, 0x5e, 0x5d, 0x33, 0x03, + 0x11, 0x23, 0x11, 0x33, 0x13, 0x11, 0x33, 0x11, 0x37, 0x33, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0xc7, 0x63, 0x52, 0x42, 0x63, 0x52, 0x1b, 0xc7, 0xc7, 0x30, 0x33, 0x33, + 0x31, 0x31, 0x33, 0x33, 0x30, 0x80, 0x12, 0x0b, 0x0c, 0x10, 0x10, 0x0c, 0x0b, 0x12, 0x01, 0x65, + 0xfe, 0x9b, 0x02, 0x6b, 0xfe, 0xb9, 0x01, 0x47, 0xfd, 0x95, 0xf0, 0x62, 0x01, 0x50, 0x4c, 0x4f, + 0x4f, 0x4c, 0x4c, 0x50, 0x50, 0x4c, 0x30, 0x25, 0x25, 0x30, 0x31, 0x25, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xdd, 0x01, 0xf4, 0x01, 0x39, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x02, + 0x03, 0x04, 0x02, 0x01, 0xa1, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x11, 0x21, + 0x15, 0x21, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0x39, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, + 0xff, 0xf3, 0x01, 0xe7, 0x02, 0x79, 0x00, 0x35, 0x00, 0x73, 0xb9, 0x00, 0x23, 0xff, 0xc0, 0x40, + 0x40, 0x0d, 0x12, 0x00, 0x4c, 0x08, 0x40, 0x12, 0x14, 0x00, 0x4c, 0x08, 0x40, 0x0f, 0x10, 0x00, + 0x4c, 0x00, 0x46, 0x12, 0x13, 0x1a, 0x5f, 0x24, 0x01, 0x24, 0x37, 0x2f, 0x1b, 0x46, 0x2d, 0x09, + 0x36, 0x23, 0x40, 0x20, 0x01, 0x20, 0x4a, 0x29, 0x12, 0x00, 0x73, 0x33, 0x15, 0x33, 0x30, 0x18, + 0x73, 0x1b, 0x2d, 0x1b, 0x33, 0x1b, 0x33, 0x1b, 0x0c, 0x24, 0x29, 0x09, 0x08, 0x05, 0x4a, 0x0c, + 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xc5, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x10, 0xed, + 0x32, 0x11, 0x33, 0x10, 0xed, 0x32, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xc4, 0xd6, 0xed, 0xcd, + 0x10, 0xd6, 0x5d, 0xc6, 0xd4, 0xd5, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x15, + 0x33, 0x15, 0x23, 0x06, 0x06, 0x07, 0x33, 0x15, 0x21, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x17, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x36, 0x36, 0x37, 0x23, + 0x35, 0x01, 0x3c, 0x05, 0x37, 0x25, 0x23, 0x46, 0x14, 0x24, 0x1b, 0x57, 0x39, 0x61, 0x67, 0x01, + 0x31, 0x68, 0x19, 0x3c, 0x1b, 0xd8, 0xfe, 0xc9, 0x01, 0x39, 0x29, 0x25, 0x54, 0x20, 0x22, 0x0b, + 0x21, 0x2d, 0x3a, 0x25, 0x72, 0x6a, 0x23, 0x4d, 0x16, 0x36, 0x1c, 0xb5, 0x01, 0xb1, 0x0d, 0x0c, + 0x28, 0x20, 0x15, 0x0d, 0x5f, 0x10, 0x1a, 0x62, 0x58, 0x05, 0x05, 0x04, 0x59, 0x15, 0x22, 0x11, + 0x59, 0x03, 0x09, 0x2c, 0x25, 0x14, 0x13, 0x5f, 0x07, 0x11, 0x0e, 0x09, 0x60, 0x57, 0x0d, 0x59, + 0x17, 0x21, 0x10, 0x59, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x17, + 0x00, 0x7a, 0xb9, 0x00, 0x0c, 0xff, 0xd0, 0x40, 0x09, 0x0e, 0x00, 0x4d, 0x03, 0x20, 0x0e, 0x00, + 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x0e, 0x00, 0x4d, 0x0b, 0x28, 0x0e, 0x00, 0x4d, 0x02, + 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x00, + 0xb8, 0xff, 0xf0, 0x40, 0x27, 0x13, 0x00, 0x4d, 0x0f, 0x13, 0x01, 0x13, 0x04, 0x00, 0x14, 0x44, + 0x0b, 0x07, 0x0f, 0x0f, 0x01, 0x0f, 0xd0, 0x10, 0x01, 0x10, 0x18, 0x0f, 0x14, 0x4a, 0x08, 0x09, + 0x03, 0x0c, 0x02, 0x0d, 0x17, 0x16, 0x08, 0x05, 0x12, 0x02, 0x05, 0x08, 0x00, 0x3f, 0x3f, 0x12, + 0x17, 0x39, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x5d, 0xd5, 0x5d, 0x32, 0x32, 0xfd, 0x32, 0x32, 0xc5, + 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x15, 0x37, 0x17, + 0x07, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x35, 0x07, 0x27, 0x37, 0x35, 0x23, 0x35, 0x21, 0x15, + 0x23, 0x15, 0x37, 0x17, 0x01, 0x38, 0x50, 0x26, 0x76, 0x7c, 0x49, 0x26, 0x6f, 0x4b, 0x24, 0x6f, + 0xa3, 0x01, 0xc2, 0xa3, 0x50, 0x25, 0x01, 0x44, 0x45, 0x25, 0x51, 0x38, 0x9b, 0x61, 0x22, 0x52, + 0x33, 0x46, 0x23, 0x4e, 0x34, 0x9c, 0x66, 0x66, 0x62, 0x25, 0x4d, 0x00, 0x00, 0x02, 0x00, 0x19, + 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x77, 0x40, 0x53, 0x9f, 0x0b, + 0x01, 0x80, 0x0b, 0x01, 0x4f, 0x0b, 0x01, 0x10, 0x0b, 0x20, 0x0b, 0x02, 0xdf, 0x0b, 0xef, 0x0b, + 0x02, 0xa0, 0x0b, 0xb0, 0x0b, 0x02, 0x7f, 0x0b, 0x01, 0x60, 0x0b, 0x01, 0x2f, 0x0b, 0x3f, 0x0b, + 0x02, 0x00, 0x0b, 0x01, 0x0b, 0x30, 0x08, 0x40, 0x08, 0x90, 0x08, 0x03, 0xd0, 0x08, 0xe0, 0x08, + 0x02, 0x0f, 0x08, 0xaf, 0x08, 0x02, 0x08, 0x0c, 0x01, 0x02, 0x51, 0x06, 0x50, 0x05, 0x60, 0x05, + 0x02, 0x05, 0x0c, 0x05, 0x01, 0x55, 0x00, 0x0b, 0x55, 0x0a, 0x02, 0x09, 0x02, 0x04, 0x08, 0x03, + 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xde, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0xc5, 0xfd, + 0xc5, 0x10, 0xd6, 0x5d, 0x5d, 0x71, 0xc5, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, + 0x71, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3d, 0x02, 0x21, 0x15, 0x01, 0xdb, + 0xa3, 0x7c, 0xa3, 0x01, 0xc2, 0x01, 0xbf, 0x66, 0xfe, 0xa7, 0x01, 0x59, 0x66, 0x46, 0x66, 0x66, + 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x72, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x73, + 0x40, 0x43, 0x9b, 0x17, 0x01, 0x23, 0x46, 0x60, 0x13, 0x80, 0x13, 0x02, 0x13, 0x27, 0x08, 0x04, + 0x03, 0x1f, 0x1a, 0x18, 0x17, 0x00, 0x44, 0x0a, 0x07, 0x06, 0x90, 0x03, 0x01, 0x03, 0x26, 0x07, + 0x4f, 0x16, 0x5f, 0x16, 0x6f, 0x16, 0x03, 0x16, 0x4a, 0x20, 0x0a, 0x20, 0x03, 0x00, 0x48, 0x18, + 0x06, 0x18, 0x0f, 0x18, 0x01, 0x4f, 0x18, 0x01, 0x20, 0x18, 0x20, 0x18, 0x01, 0x1b, 0x4a, 0x10, + 0x02, 0x02, 0x08, 0x01, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5d, + 0x71, 0x11, 0x33, 0x10, 0xed, 0x32, 0x11, 0x33, 0x10, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xd6, 0x5d, + 0x32, 0x32, 0x32, 0xfd, 0x32, 0x32, 0xc5, 0x33, 0x10, 0xcd, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0x31, + 0x30, 0x00, 0x5d, 0x37, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x3e, + 0x03, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, 0x33, 0x15, 0x03, 0x22, 0x06, 0x07, + 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xd0, 0x7b, 0x43, 0x43, 0x43, 0x43, 0x11, 0x2a, 0x2b, + 0x29, 0x11, 0x6c, 0x77, 0x78, 0x6e, 0x22, 0xc8, 0x96, 0x09, 0x20, 0x09, 0x27, 0x33, 0x30, 0x30, + 0x58, 0x58, 0x58, 0x63, 0x48, 0x62, 0xfe, 0x04, 0x06, 0x03, 0x02, 0x56, 0x61, 0x62, 0x57, 0x47, + 0x63, 0x01, 0xaf, 0x01, 0x02, 0xa0, 0x2d, 0x2b, 0x29, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, + 0x02, 0x16, 0x01, 0x95, 0x02, 0xae, 0x00, 0x11, 0x00, 0x16, 0x40, 0x09, 0x0d, 0x05, 0x12, 0x00, + 0x09, 0x0c, 0xa0, 0x06, 0xa0, 0x00, 0x3f, 0x3f, 0xde, 0xc5, 0x01, 0x10, 0xd6, 0xc4, 0x31, 0x30, + 0x13, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0xfa, + 0x1c, 0x36, 0x2a, 0x1c, 0x02, 0x5c, 0x06, 0x22, 0x16, 0x17, 0x22, 0x06, 0x5c, 0x03, 0x1c, 0x2a, + 0x36, 0x02, 0x16, 0x11, 0x21, 0x30, 0x1e, 0x18, 0x23, 0x1c, 0x1b, 0x23, 0x18, 0x1e, 0x30, 0x20, + 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x72, 0x02, 0x06, + 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x01, 0xe4, 0x02, 0x6b, 0x02, 0x06, + 0x02, 0xc6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, + 0x01, 0x9b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x16, 0xff, 0xf3, 0x01, 0xde, 0x02, 0x79, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x23, 0x00, 0x3e, 0xb2, 0x1a, 0x46, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x09, + 0x0f, 0x48, 0x0a, 0x20, 0x01, 0x30, 0x01, 0x02, 0x01, 0x20, 0x00, 0x01, 0x00, 0x04, 0x46, 0x10, + 0x24, 0x02, 0xa5, 0x01, 0x01, 0x15, 0x07, 0x4a, 0x1f, 0x09, 0x0d, 0x4a, 0x15, 0x03, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xde, 0x5d, 0xd5, 0x5d, 0xde, + 0x2b, 0xed, 0x31, 0x30, 0x13, 0x33, 0x15, 0x23, 0x27, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x2e, 0x02, 0xb3, 0x8f, 0x8f, 0x29, 0x30, 0x40, 0x3f, 0x31, 0x30, 0x40, 0x3f, 0x31, + 0x74, 0x20, 0x3c, 0x54, 0x34, 0x36, 0x55, 0x3b, 0x1e, 0x20, 0x3a, 0x55, 0x34, 0x36, 0x55, 0x3b, + 0x1f, 0x01, 0x65, 0x5d, 0x2e, 0x68, 0x70, 0x71, 0x67, 0x67, 0x71, 0x71, 0x67, 0x56, 0x7a, 0x4e, + 0x25, 0x25, 0x4e, 0x7a, 0x56, 0x56, 0x7b, 0x4e, 0x24, 0x24, 0x4e, 0x7b, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x10, 0x00, 0x26, 0x40, 0x14, 0x00, 0x0d, 0x03, 0x0c, + 0x08, 0x05, 0x11, 0x10, 0x12, 0x09, 0x11, 0x03, 0x0d, 0x02, 0x0c, 0x02, 0x09, 0x08, 0x00, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x39, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x31, 0x30, + 0x21, 0x26, 0x26, 0x27, 0x0e, 0x03, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, 0x01, + 0x67, 0x1f, 0x2e, 0x21, 0x11, 0x1c, 0x1a, 0x1a, 0x0f, 0x80, 0x2c, 0x5a, 0x2a, 0x86, 0x2c, 0x57, + 0x29, 0x92, 0xf5, 0x6c, 0x3b, 0x73, 0x7a, 0x82, 0x49, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, + 0xb2, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x01, 0xd4, 0x02, 0x6b, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2b, 0x40, 0x15, 0x06, 0x04, 0x0a, 0x08, 0x0c, 0x02, 0x00, 0x0c, + 0x04, 0x48, 0x05, 0x05, 0x00, 0x08, 0x48, 0x0b, 0x08, 0x03, 0x48, 0x00, 0x02, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xc5, 0xd6, 0xc5, 0x31, + 0x30, 0x13, 0x21, 0x15, 0x21, 0x17, 0x35, 0x21, 0x15, 0x05, 0x21, 0x15, 0x21, 0x20, 0x01, 0xb4, + 0xfe, 0x4c, 0x27, 0x01, 0x67, 0xfe, 0x72, 0x01, 0xb4, 0xfe, 0x4c, 0x02, 0x6b, 0x68, 0xf0, 0x68, + 0x68, 0xab, 0x68, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x06, + 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x06, + 0x02, 0xd2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x72, 0x02, 0x06, + 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xd6, 0x02, 0x6b, 0x00, 0x1b, + 0x00, 0x7b, 0x40, 0x10, 0x18, 0x40, 0x0a, 0x00, 0x4d, 0x17, 0x08, 0x0a, 0x00, 0x4d, 0x13, 0x40, + 0x12, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0x80, 0xb3, 0x0c, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0x80, 0xb3, 0x0c, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0x40, + 0x25, 0x0b, 0x00, 0x4d, 0x13, 0x09, 0x1c, 0x08, 0x15, 0x1d, 0x0e, 0x00, 0x05, 0x16, 0x1c, 0x13, + 0x14, 0x48, 0x15, 0x05, 0x17, 0x0e, 0x00, 0x17, 0x00, 0x0e, 0x05, 0x04, 0x07, 0x15, 0x08, 0x09, + 0x08, 0x48, 0x07, 0x02, 0x06, 0x02, 0x00, 0x3f, 0x3f, 0xed, 0x32, 0x3f, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x2f, 0x18, 0x2f, 0x2f, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xd4, 0xd6, 0xc5, 0x10, 0xd6, + 0xc4, 0x12, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x2e, 0x03, + 0x27, 0x35, 0x21, 0x15, 0x21, 0x1e, 0x03, 0x17, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x3e, + 0x03, 0xe8, 0x14, 0x34, 0x34, 0x31, 0x12, 0x01, 0xac, 0xfe, 0xf8, 0x13, 0x2a, 0x2b, 0x28, 0x11, + 0x0e, 0x32, 0x37, 0x35, 0x0f, 0x01, 0x23, 0xfe, 0x46, 0x15, 0x33, 0x37, 0x36, 0x01, 0x39, 0x1c, + 0x3f, 0x3f, 0x38, 0x15, 0x4b, 0x66, 0x17, 0x35, 0x36, 0x34, 0x16, 0x10, 0x38, 0x3e, 0x3b, 0x12, + 0x66, 0x51, 0x19, 0x3b, 0x3e, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, + 0x02, 0x93, 0x02, 0x06, 0x02, 0xd7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x00, 0x1b, 0x00, 0xb2, 0x40, 0x70, 0x19, 0x40, 0x0e, 0x00, 0x4d, 0x16, 0x20, 0x0d, + 0x00, 0x4d, 0x10, 0x20, 0x0e, 0x00, 0x4d, 0x0c, 0x40, 0x0d, 0x00, 0x4d, 0x0b, 0x40, 0x0d, 0x00, + 0x4d, 0x00, 0x40, 0x0d, 0x00, 0x4d, 0x5f, 0x19, 0x01, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x03, + 0x06, 0x52, 0x60, 0x07, 0x01, 0x1f, 0x07, 0x01, 0xbf, 0x07, 0xcf, 0x07, 0xdf, 0x07, 0x03, 0xa0, + 0x07, 0x01, 0x5f, 0x07, 0x6f, 0x07, 0x7f, 0x07, 0x03, 0x07, 0x40, 0x09, 0x0c, 0x48, 0x07, 0x1d, + 0x50, 0x1b, 0x01, 0x1b, 0x52, 0x5f, 0x1a, 0x01, 0x1a, 0x1a, 0x19, 0x19, 0x0d, 0x00, 0x00, 0x0b, + 0x0b, 0x40, 0x0c, 0x01, 0x0c, 0x52, 0x0d, 0x20, 0x13, 0x30, 0x13, 0x40, 0x13, 0x03, 0x13, 0x52, + 0x10, 0x12, 0x20, 0x12, 0x30, 0x12, 0x03, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x15, 0x18, 0x48, + 0xb1, 0x12, 0x01, 0x12, 0x1c, 0x0c, 0x08, 0x06, 0x02, 0x00, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, + 0x2b, 0x71, 0xed, 0x5d, 0xd4, 0xed, 0x5d, 0x32, 0x2f, 0x33, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x2f, + 0x5d, 0xed, 0x5d, 0x10, 0xde, 0x2b, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0xed, 0x5d, 0x31, 0x30, 0x00, + 0x5d, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x33, 0x15, + 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x35, 0x33, 0x01, 0x2a, 0x11, 0x1e, 0x16, 0x0c, 0x60, 0x5c, 0x55, 0x60, 0x55, 0x5c, 0x60, 0x0c, + 0x16, 0x1e, 0x11, 0x60, 0xf0, 0x0c, 0x21, 0x3d, 0x30, 0xe1, 0xd6, 0x83, 0x78, 0x07, 0x93, 0x93, + 0x07, 0x78, 0x83, 0xd6, 0xe1, 0x30, 0x3d, 0x21, 0x0c, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x00, 0x27, 0x00, 0x53, 0xb6, 0x25, 0x40, 0x09, 0x0a, 0x00, + 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x2b, 0x09, 0x0a, 0x00, 0x4c, 0x14, 0x46, 0x0a, 0x60, 0x0f, + 0x01, 0x0f, 0x7f, 0x11, 0x01, 0x60, 0x11, 0x01, 0x3f, 0x11, 0x01, 0x11, 0x29, 0x1e, 0x46, 0x00, + 0x23, 0x2f, 0x21, 0x01, 0x21, 0x28, 0x25, 0x48, 0x22, 0x08, 0x0d, 0x48, 0x10, 0x08, 0x19, 0x4a, + 0x05, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xc4, 0x5d, 0xd6, 0xd4, 0xed, + 0x10, 0xc4, 0x5d, 0x5d, 0x5d, 0xd6, 0x5d, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, 0x35, 0x36, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x17, 0x15, 0x23, 0x35, 0x33, 0x26, + 0x26, 0x0e, 0x29, 0x42, 0x55, 0x2d, 0x2c, 0x55, 0x43, 0x29, 0x24, 0x2a, 0x51, 0xd7, 0x22, 0x35, + 0x0b, 0x19, 0x2b, 0x20, 0x20, 0x2b, 0x1b, 0x0b, 0x31, 0x26, 0xd9, 0x54, 0x2a, 0x25, 0x01, 0x62, + 0x4b, 0x6a, 0x43, 0x1f, 0x1f, 0x43, 0x6a, 0x4b, 0x42, 0x7e, 0x3c, 0x66, 0x57, 0x29, 0x77, 0x50, + 0x27, 0x47, 0x38, 0x21, 0x21, 0x38, 0x47, 0x27, 0x50, 0x77, 0x29, 0x57, 0x66, 0x3c, 0x81, 0x00, + 0x00, 0x02, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x01, 0xe0, 0x00, 0x15, 0x00, 0x26, 0x00, 0x49, + 0x40, 0x0f, 0x15, 0x40, 0x09, 0x00, 0x4d, 0x0f, 0x00, 0x01, 0x1e, 0x53, 0x12, 0x00, 0x15, 0x01, + 0x15, 0xb8, 0xff, 0xc0, 0xb7, 0x0d, 0x14, 0x48, 0x15, 0x28, 0x16, 0x53, 0x0b, 0xb8, 0xff, 0xc0, + 0x40, 0x11, 0x0d, 0x14, 0x48, 0x0b, 0x27, 0x22, 0x57, 0x0e, 0x0b, 0x19, 0x57, 0x06, 0x07, 0x15, + 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, + 0xd6, 0x2b, 0x5d, 0xd6, 0xed, 0x31, 0x30, 0x5d, 0x2b, 0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x16, 0x17, 0x25, 0x14, + 0x16, 0x33, 0x32, 0x37, 0x26, 0x26, 0x35, 0x35, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x01, 0xd3, + 0x2a, 0x31, 0x13, 0x22, 0x43, 0x1f, 0x27, 0x44, 0x31, 0x1d, 0x7e, 0x6c, 0x24, 0x50, 0x2c, 0x16, + 0x1c, 0xfe, 0xc2, 0x2b, 0x26, 0x20, 0x25, 0x02, 0x03, 0x0c, 0x15, 0x0a, 0x1d, 0x27, 0x18, 0x0a, + 0x0a, 0x17, 0x16, 0x17, 0x16, 0x1e, 0x3a, 0x57, 0x38, 0x83, 0x80, 0x0c, 0x0e, 0xfe, 0xe2, 0x2d, + 0x1c, 0x03, 0x88, 0x44, 0x43, 0x16, 0x10, 0x29, 0x12, 0xb5, 0x03, 0x02, 0x16, 0x27, 0x36, 0x00, + 0x00, 0x02, 0x00, 0x36, 0xff, 0x5a, 0x01, 0xdb, 0x02, 0xb5, 0x00, 0x1a, 0x00, 0x33, 0x00, 0x64, + 0xb9, 0x00, 0x26, 0xff, 0xc0, 0x40, 0x38, 0x0c, 0x00, 0x4d, 0x1f, 0x28, 0x01, 0x28, 0x28, 0x34, + 0x35, 0x2d, 0x40, 0x0b, 0x00, 0x4d, 0x2d, 0x53, 0x00, 0x22, 0x53, 0x00, 0x06, 0x01, 0x06, 0x35, + 0x1b, 0x0e, 0x51, 0x30, 0x10, 0x40, 0x10, 0x50, 0x10, 0x03, 0x10, 0x34, 0x26, 0x55, 0x27, 0x03, + 0x03, 0x27, 0x1d, 0x30, 0x57, 0x16, 0x01, 0x10, 0x0e, 0x0f, 0x12, 0x1d, 0x57, 0x0b, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x01, 0x10, + 0xd6, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x2b, 0x11, 0x12, 0x39, 0x2f, 0x5d, + 0x31, 0x30, 0x00, 0x2b, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x15, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x03, 0x16, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x15, 0x01, 0xae, 0x23, 0x2a, 0x44, 0x36, 0x23, 0x39, 0x48, 0x25, 0x1e, 0x2c, 0x17, + 0x7b, 0x1f, 0x35, 0x47, 0x29, 0x22, 0x41, 0x33, 0x1e, 0xfd, 0x22, 0x28, 0x18, 0x25, 0x19, 0x0c, + 0x32, 0x34, 0x17, 0x0b, 0x12, 0x1b, 0x13, 0x09, 0x1f, 0x21, 0x20, 0x23, 0x02, 0x0b, 0x2b, 0x4a, + 0x17, 0x1b, 0x5c, 0x3c, 0x3d, 0x52, 0x32, 0x15, 0x0a, 0x0a, 0xb0, 0x02, 0x86, 0x38, 0x51, 0x34, + 0x18, 0x16, 0x2b, 0x40, 0xfe, 0x42, 0x16, 0x11, 0x1e, 0x27, 0x16, 0x2d, 0x40, 0x62, 0x10, 0x1b, + 0x21, 0x12, 0x1f, 0x32, 0x32, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0xff, 0x5b, 0x01, 0xe8, + 0x01, 0xd6, 0x00, 0x13, 0x00, 0x69, 0xb5, 0x10, 0x20, 0x0a, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xe0, + 0xb3, 0x0a, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x09, 0x00, 0x4d, 0x0a, 0x20, 0x13, + 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x28, 0x13, 0x00, 0x4d, 0x08, 0x20, 0x09, 0x00, 0x4d, + 0x07, 0x20, 0x09, 0x00, 0x4d, 0x09, 0x20, 0x0a, 0x00, 0x4d, 0x10, 0x09, 0x09, 0x06, 0x0c, 0x51, + 0x0d, 0x15, 0x06, 0x51, 0x05, 0x13, 0x51, 0x00, 0x05, 0x14, 0x10, 0x06, 0x0d, 0x0a, 0x00, 0x12, + 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xed, 0x10, 0xd6, 0xed, 0x11, 0x39, + 0x3d, 0x2f, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, + 0x2e, 0x03, 0x27, 0x33, 0x16, 0x16, 0x17, 0x36, 0x36, 0x37, 0x33, 0x06, 0x06, 0x07, 0x16, 0x16, + 0x17, 0xc1, 0x09, 0x2c, 0x35, 0x36, 0x13, 0x81, 0x22, 0x32, 0x14, 0x23, 0x3c, 0x13, 0x7f, 0x22, + 0x67, 0x3c, 0x08, 0x0a, 0x02, 0xa5, 0x57, 0xb4, 0xa8, 0x92, 0x36, 0x60, 0x9e, 0x49, 0x49, 0xab, + 0x53, 0x86, 0xeb, 0x69, 0x30, 0x49, 0x28, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xd7, + 0x02, 0xb5, 0x00, 0x2a, 0x00, 0x3a, 0x00, 0x50, 0xb3, 0x3b, 0x06, 0x01, 0x30, 0xb8, 0xff, 0xc0, + 0x40, 0x2a, 0x0a, 0x00, 0x4d, 0x11, 0x40, 0x0f, 0x00, 0x4d, 0x2b, 0x53, 0x30, 0x10, 0x01, 0x10, + 0x40, 0x21, 0x60, 0x21, 0x02, 0x21, 0x3c, 0x19, 0x53, 0x08, 0x35, 0x53, 0x00, 0x3b, 0x30, 0x05, + 0x1e, 0x03, 0x0d, 0x38, 0x57, 0x26, 0x07, 0x11, 0x14, 0x57, 0x0d, 0x9f, 0x00, 0x3f, 0xfd, 0xc6, + 0x3f, 0xed, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x10, 0xd6, 0x5d, 0xc4, 0x5d, + 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x5d, 0x37, 0x34, 0x3e, 0x02, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0x17, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x2e, + 0x02, 0x27, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1f, 0x0b, 0x1e, 0x35, 0x2b, 0x1d, + 0x24, 0x15, 0x2a, 0x40, 0x2b, 0x35, 0x48, 0x22, 0x1a, 0x18, 0x3f, 0x26, 0x09, 0x13, 0x11, 0x0a, + 0x0b, 0x1b, 0x2d, 0x21, 0x3b, 0x46, 0x1f, 0x39, 0x51, 0x31, 0x32, 0x51, 0x3b, 0x20, 0x01, 0x3a, + 0x11, 0x1b, 0x24, 0x13, 0x1c, 0x23, 0x13, 0x07, 0x35, 0x2a, 0x2a, 0x33, 0xda, 0x16, 0x38, 0x3a, + 0x37, 0x15, 0x17, 0x39, 0x29, 0x1d, 0x34, 0x27, 0x16, 0x16, 0x0f, 0x5c, 0x0c, 0x15, 0x02, 0x08, + 0x10, 0x0d, 0x0c, 0x17, 0x1b, 0x22, 0x16, 0x27, 0x67, 0x48, 0x37, 0x59, 0x3e, 0x21, 0x1f, 0x3b, + 0x56, 0x41, 0x1a, 0x2a, 0x23, 0x1e, 0x0e, 0x0d, 0x24, 0x28, 0x28, 0x12, 0x44, 0x43, 0x42, 0x00, + 0x00, 0x01, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x01, 0xe2, 0x00, 0x30, 0x00, 0x83, 0x40, 0x0b, + 0x2a, 0x20, 0x0c, 0x00, 0x4d, 0x20, 0x20, 0x0c, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb4, 0x13, + 0x14, 0x00, 0x4c, 0x18, 0xb8, 0xff, 0xe0, 0xb4, 0x19, 0x1a, 0x00, 0x4c, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x36, 0x17, 0x00, 0x4d, 0xc0, 0x30, 0xd0, 0x30, 0xe0, 0x30, 0x03, 0x30, 0x1a, 0x32, 0x0c, + 0x25, 0x08, 0x53, 0x28, 0x13, 0x53, 0x22, 0x31, 0x5f, 0x0e, 0x6f, 0x0e, 0x02, 0x30, 0x0e, 0x01, + 0x0e, 0x55, 0x0b, 0x25, 0x0b, 0x25, 0x2d, 0x1d, 0x00, 0x4f, 0x03, 0x01, 0x03, 0x57, 0x2d, 0x0b, + 0x19, 0x40, 0x16, 0x01, 0x16, 0x57, 0x1d, 0x07, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xfd, 0x5d, + 0xc6, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x5d, 0x01, 0x10, 0xd6, 0xed, + 0xd4, 0xed, 0xd5, 0xc5, 0x10, 0xd6, 0xc6, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x01, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x01, 0x9c, + 0x17, 0x4c, 0x2a, 0x16, 0x1d, 0x12, 0x07, 0x1d, 0x25, 0x6a, 0x69, 0x0f, 0x1e, 0x17, 0x0e, 0x2e, + 0x2c, 0x34, 0x53, 0x14, 0x1d, 0x25, 0x64, 0x32, 0x29, 0x4a, 0x37, 0x21, 0x26, 0x27, 0x1d, 0x21, + 0x20, 0x35, 0x46, 0x26, 0x33, 0x4e, 0x22, 0x01, 0x63, 0x06, 0x0e, 0x09, 0x0e, 0x11, 0x08, 0x11, + 0x1b, 0x5d, 0x04, 0x0b, 0x13, 0x0f, 0x15, 0x19, 0x13, 0x07, 0x65, 0x0f, 0x12, 0x0f, 0x22, 0x37, + 0x28, 0x2b, 0x37, 0x11, 0x11, 0x30, 0x23, 0x26, 0x34, 0x20, 0x0e, 0x0e, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x36, 0xff, 0x56, 0x01, 0xd1, 0x02, 0xaf, 0x00, 0x24, 0x00, 0x3e, 0xb7, 0x04, + 0x07, 0x53, 0x18, 0x00, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x0b, 0x0e, 0x48, 0x00, + 0x26, 0x14, 0x16, 0x1d, 0x53, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0a, 0x0e, 0x48, 0x0f, 0x25, + 0x15, 0x55, 0x17, 0x00, 0x04, 0x03, 0x10, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, + 0xed, 0xd4, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xc4, 0xfd, 0xc6, 0x31, 0x30, 0x05, 0x14, 0x06, 0x07, + 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x23, 0x35, + 0x21, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x03, 0x01, 0xd1, 0x1b, 0x16, 0x67, 0x0e, + 0x0f, 0x38, 0x38, 0x2a, 0x42, 0x2d, 0x17, 0x2f, 0x44, 0x4c, 0x1d, 0xc3, 0x01, 0x6d, 0x1d, 0x59, + 0x55, 0x3d, 0x35, 0x3d, 0x2d, 0x40, 0x2a, 0x14, 0x25, 0x25, 0x40, 0x20, 0x25, 0x1a, 0x24, 0x11, + 0x18, 0x1d, 0x0e, 0x0c, 0x1f, 0x30, 0x44, 0x2f, 0x38, 0x6a, 0x5f, 0x4f, 0x1e, 0x66, 0x51, 0x1a, + 0x4e, 0x61, 0x73, 0x3d, 0x34, 0x33, 0x12, 0x0e, 0x1b, 0x21, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb9, 0x01, 0xe0, 0x00, 0x13, 0x00, 0x32, 0x40, 0x0a, 0x0b, 0x51, 0x09, 0x15, + 0x11, 0x51, 0x50, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x09, 0x0c, 0x48, 0x00, 0x14, + 0x12, 0x06, 0x09, 0x0e, 0x30, 0x0e, 0x01, 0x0e, 0x57, 0x03, 0x0b, 0x00, 0x3f, 0xed, 0x5d, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x3f, + 0x21, 0x61, 0x39, 0x38, 0x4a, 0x2b, 0x12, 0x7b, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, 0x01, 0xc7, + 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0x52, 0x01, 0x9e, 0x42, 0x3a, 0x02, 0x02, 0xfe, 0x8f, + 0x00, 0x03, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xd4, 0x02, 0xb5, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x1d, + 0x00, 0x35, 0x40, 0x1e, 0x11, 0x1b, 0x53, 0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x03, 0x00, 0x1f, + 0x12, 0x1a, 0x53, 0x06, 0x1e, 0x11, 0x55, 0x1b, 0x1b, 0x03, 0x17, 0x57, 0x09, 0x9f, 0x0c, 0x57, + 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc0, + 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x03, 0x32, 0x3e, 0x02, 0x37, 0x23, 0x1e, 0x03, 0x13, 0x22, 0x06, 0x07, 0x33, + 0x26, 0x26, 0x01, 0xd4, 0x74, 0x66, 0x66, 0x75, 0x75, 0x66, 0x66, 0x74, 0xda, 0x18, 0x23, 0x16, + 0x0c, 0x01, 0xbe, 0x01, 0x0c, 0x18, 0x23, 0x18, 0x30, 0x2e, 0x02, 0xbe, 0x02, 0x2c, 0x01, 0x55, + 0xb3, 0xaf, 0xaf, 0xb3, 0xb2, 0xae, 0xae, 0xfe, 0x56, 0x1c, 0x33, 0x47, 0x2b, 0x2b, 0x47, 0x33, + 0x1c, 0x01, 0xef, 0x69, 0x57, 0x57, 0x69, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x01, 0xd6, 0x00, 0x13, 0x00, 0x2d, 0x40, 0x1b, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, + 0xa0, 0x00, 0x05, 0x00, 0x15, 0x0d, 0x51, 0x08, 0x0a, 0x14, 0x09, 0x55, 0x0b, 0x0a, 0x13, 0x10, + 0x57, 0x03, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xc6, + 0x5d, 0x31, 0x30, 0x25, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd3, 0x26, 0x43, 0x1c, 0x30, 0x41, 0x27, 0x10, 0x82, + 0xfd, 0x1f, 0x24, 0x11, 0x2e, 0x1e, 0x14, 0x12, 0x0d, 0x1c, 0x35, 0x4c, 0x31, 0xad, 0x66, 0xfe, + 0xe6, 0x2a, 0x27, 0x08, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, + 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x4b, 0xb9, 0x00, 0x12, 0xff, 0xe0, 0xb3, 0x0a, 0x00, 0x4d, 0x03, + 0xb8, 0xff, 0xe0, 0x40, 0x24, 0x0a, 0x00, 0x4d, 0x05, 0x06, 0x11, 0x60, 0x10, 0x80, 0x10, 0x90, + 0x10, 0xa0, 0x10, 0x04, 0x10, 0x1c, 0x16, 0x0b, 0x00, 0x51, 0x19, 0x1b, 0x1a, 0x0a, 0x17, 0x06, + 0x16, 0x0b, 0x00, 0x03, 0x05, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0x32, 0xc0, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, 0xc5, 0x31, 0x30, 0x2b, + 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, + 0x15, 0x23, 0x11, 0x33, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, + 0x19, 0x3a, 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x7c, 0x01, 0x1c, 0x15, + 0x2f, 0x32, 0x2f, 0x15, 0x17, 0x36, 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, + 0x3d, 0x37, 0x12, 0xde, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x01, 0xdd, + 0x02, 0xb5, 0x00, 0x24, 0x00, 0x32, 0x40, 0x1a, 0x1a, 0x51, 0x19, 0x26, 0x14, 0x1f, 0x05, 0x03, + 0x25, 0x26, 0x24, 0x51, 0x00, 0x0e, 0x25, 0x1f, 0x11, 0x24, 0x06, 0x1a, 0x06, 0x0d, 0x0a, 0x57, + 0x11, 0x00, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x39, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x11, + 0x12, 0x17, 0x39, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x33, 0x3e, 0x03, 0x37, 0x2e, 0x03, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, + 0x0e, 0x03, 0x07, 0x13, 0x11, 0x2d, 0x31, 0x32, 0x18, 0x10, 0x1a, 0x18, 0x19, 0x0f, 0x0d, 0x11, + 0x0b, 0x16, 0x14, 0x26, 0x18, 0x40, 0x4d, 0x1d, 0x1f, 0x38, 0x31, 0x27, 0x0f, 0x8e, 0x08, 0x14, + 0x15, 0x16, 0x0a, 0x0e, 0x1d, 0x1b, 0x16, 0x07, 0x40, 0x7d, 0x75, 0x68, 0x2c, 0x2a, 0x34, 0x1e, + 0x0a, 0x02, 0x05, 0x63, 0x07, 0x06, 0x3d, 0x3d, 0x42, 0x99, 0x98, 0x8f, 0x39, 0x24, 0x51, 0x51, + 0x4e, 0x21, 0x24, 0x51, 0x53, 0x4e, 0x1f, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0x5b, 0x01, 0xb6, + 0x01, 0xd6, 0x02, 0x06, 0x00, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, + 0x01, 0xd6, 0x02, 0x06, 0x00, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0xff, 0x56, 0x01, 0xd2, + 0x02, 0xb5, 0x00, 0x38, 0x00, 0x67, 0xb7, 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x03, 0x53, 0x35, 0xb8, + 0xff, 0xc0, 0xb6, 0x09, 0x0e, 0x48, 0x35, 0x3a, 0x24, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x0b, 0x09, + 0x0e, 0x48, 0x15, 0x3a, 0x1e, 0x53, 0x0f, 0x2b, 0x53, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x0a, + 0x0e, 0x48, 0x09, 0x00, 0x39, 0x26, 0x55, 0x30, 0x06, 0x0c, 0x38, 0x23, 0x0c, 0x23, 0x0c, 0x12, + 0x00, 0x38, 0x0e, 0x16, 0x19, 0x57, 0x12, 0x00, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xc5, 0x12, 0x39, + 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0xed, + 0xd4, 0xed, 0x10, 0xd6, 0x2b, 0xc6, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x05, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x33, + 0x15, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, + 0x01, 0x3a, 0x0e, 0x10, 0x41, 0x36, 0x5a, 0x52, 0x43, 0x32, 0x2e, 0x25, 0x6e, 0x67, 0x36, 0x50, + 0x14, 0x19, 0x1d, 0x3a, 0x1d, 0x1f, 0x29, 0x18, 0x09, 0x12, 0x1d, 0x26, 0x15, 0x6a, 0x64, 0x18, + 0x33, 0x28, 0x1a, 0x0f, 0x1c, 0x28, 0x1a, 0x2c, 0x43, 0x2d, 0x16, 0x1b, 0x16, 0x83, 0x1a, 0x22, + 0x11, 0x1a, 0x1c, 0x0d, 0x17, 0x5e, 0x4a, 0x42, 0x50, 0x14, 0x1a, 0x4b, 0x2f, 0x4f, 0x60, 0x11, + 0x08, 0x60, 0x0b, 0x09, 0x0f, 0x1a, 0x20, 0x11, 0x16, 0x20, 0x15, 0x0a, 0x66, 0x06, 0x14, 0x28, + 0x21, 0x18, 0x23, 0x18, 0x12, 0x07, 0x0c, 0x17, 0x20, 0x2c, 0x22, 0x25, 0x40, 0x20, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x01, 0xe2, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, 0x01, 0xd6, 0x02, 0x06, 0x02, 0xf2, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x38, + 0xb2, 0x17, 0x53, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x09, 0x0f, 0x48, 0x0c, 0x1f, 0x03, 0x1d, + 0x51, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0f, 0x48, 0x06, 0x1e, 0x1a, 0x57, 0x09, 0x0b, + 0x04, 0x0e, 0x14, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, + 0xfd, 0xc0, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x15, 0x1e, 0x2c, 0x11, 0x7b, 0x64, 0x61, 0x6d, 0x64, 0x19, + 0x30, 0x48, 0x8a, 0x0b, 0x21, 0x16, 0x2b, 0x30, 0x25, 0x2a, 0x20, 0x2e, 0x09, 0x0c, 0x0a, 0xb2, + 0x01, 0xab, 0x63, 0x77, 0x82, 0x73, 0x36, 0x5a, 0x41, 0x23, 0x79, 0x08, 0x09, 0x49, 0x48, 0x45, + 0x43, 0x32, 0x3b, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x56, 0x01, 0xd2, 0x01, 0xe2, 0x00, 0x25, + 0x00, 0x4b, 0x40, 0x1b, 0x23, 0x53, 0x00, 0x1c, 0x20, 0x1c, 0x30, 0x1c, 0x40, 0x1c, 0x04, 0x1c, + 0x00, 0x0d, 0x20, 0x0d, 0x30, 0x0d, 0x03, 0x0d, 0x27, 0x50, 0x27, 0x01, 0x14, 0x53, 0x05, 0xb8, + 0xff, 0xc0, 0x40, 0x11, 0x0b, 0x0e, 0x48, 0x05, 0x20, 0x26, 0x17, 0x00, 0x0a, 0x20, 0x1f, 0x0e, + 0x0e, 0x11, 0x57, 0x0a, 0x0b, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xc5, 0x12, 0x39, 0x39, 0x01, 0x10, + 0xc6, 0xd6, 0x2b, 0xed, 0x5d, 0x10, 0xc6, 0x5d, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x37, 0x2e, 0x03, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0xeb, 0x2b, + 0x46, 0x32, 0x1b, 0x25, 0x45, 0x64, 0x3f, 0x2b, 0x47, 0x22, 0x1e, 0x16, 0x34, 0x21, 0x48, 0x52, + 0x3c, 0x43, 0x30, 0x40, 0x27, 0x11, 0x1b, 0x16, 0x67, 0x0e, 0x0f, 0x30, 0x0d, 0x0a, 0x21, 0x34, + 0x4b, 0x36, 0x34, 0x5a, 0x42, 0x25, 0x0d, 0x0d, 0x61, 0x08, 0x0a, 0x46, 0x43, 0x3b, 0x3c, 0x0f, + 0x0c, 0x1a, 0x21, 0x2b, 0x1d, 0x25, 0x40, 0x20, 0x27, 0x1a, 0x22, 0x11, 0x16, 0x1e, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xeb, 0x01, 0xd6, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3d, + 0xb2, 0x1a, 0x53, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x09, 0x0c, 0x48, 0x03, 0x80, 0x14, 0x90, + 0x14, 0x02, 0x14, 0x29, 0x23, 0x53, 0x80, 0x0d, 0x90, 0x0d, 0x02, 0x0d, 0x28, 0x00, 0x55, 0x13, + 0x0a, 0x1e, 0x57, 0x12, 0x0a, 0x15, 0x57, 0x08, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x01, 0x16, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x33, 0x15, 0x03, + 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, + 0x93, 0x17, 0x1a, 0x1a, 0x34, 0x51, 0x37, 0x2f, 0x4d, 0x37, 0x1e, 0x21, 0x3d, 0x57, 0x35, 0xe4, + 0xfd, 0x18, 0x21, 0x15, 0x0a, 0x1a, 0x16, 0x0f, 0x1c, 0x29, 0x1b, 0x0d, 0x0b, 0x15, 0x20, 0x01, + 0x70, 0x23, 0x4f, 0x29, 0x2b, 0x52, 0x3f, 0x26, 0x23, 0x40, 0x5a, 0x37, 0x3a, 0x59, 0x3d, 0x1f, + 0x66, 0xfe, 0xed, 0x15, 0x23, 0x2f, 0x1a, 0x2b, 0x50, 0x17, 0x18, 0x28, 0x35, 0x1c, 0x19, 0x2f, + 0x24, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xe0, 0x01, 0xd6, 0x00, 0x17, + 0x00, 0x40, 0xb7, 0x00, 0x0f, 0x10, 0x0f, 0x20, 0x0f, 0x03, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x0a, + 0x0d, 0x11, 0x48, 0x0f, 0x19, 0x04, 0x05, 0x51, 0x00, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0e, + 0x11, 0x48, 0x01, 0x18, 0x0e, 0x09, 0x57, 0x12, 0x07, 0x00, 0x05, 0x55, 0x03, 0x0a, 0x00, 0x3f, + 0xfd, 0xc0, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xd5, 0xfd, 0xc5, 0x10, 0xc6, 0x2b, 0x5d, + 0x31, 0x30, 0x13, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, + 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x8b, 0x67, 0x01, 0xa4, 0xc1, 0x29, 0x20, 0x13, + 0x20, 0x1d, 0x1e, 0x11, 0x11, 0x22, 0x50, 0x2c, 0x29, 0x43, 0x30, 0x1b, 0x01, 0x70, 0x66, 0x66, + 0xb4, 0x34, 0x28, 0x03, 0x07, 0x0a, 0x08, 0x69, 0x0f, 0x0f, 0x13, 0x2e, 0x4f, 0x3b, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x01, 0xd6, 0x00, 0x11, 0x00, 0x2c, 0x40, 0x1a, + 0x0c, 0x51, 0x00, 0x0f, 0x01, 0x0f, 0x13, 0x06, 0x51, 0x10, 0x03, 0x20, 0x03, 0x30, 0x03, 0x03, + 0x03, 0x12, 0x0d, 0x0a, 0x05, 0x0a, 0x09, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x22, 0x26, 0x35, 0x11, 0x33, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x33, 0x11, 0x14, 0x06, 0xf9, 0x68, 0x5e, 0x7c, + 0x1f, 0x2b, 0x2b, 0x1e, 0x7d, 0x5d, 0x0d, 0x68, 0x70, 0x01, 0x0b, 0xfc, 0x3e, 0x36, 0x36, 0x3e, + 0xfc, 0xfe, 0xf5, 0x70, 0x68, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0xff, 0x5b, 0x01, 0xdb, + 0x01, 0xd6, 0x00, 0x08, 0x00, 0x11, 0x00, 0x24, 0x00, 0x75, 0x40, 0x51, 0x2f, 0x0e, 0x3f, 0x0e, + 0x02, 0x0e, 0x40, 0x15, 0x18, 0x48, 0x0e, 0x52, 0x60, 0x1f, 0x80, 0x1f, 0x90, 0x1f, 0xa0, 0x1f, + 0x04, 0x1f, 0x26, 0x24, 0x40, 0x11, 0x50, 0x11, 0x60, 0x11, 0x03, 0x11, 0x52, 0x14, 0x80, 0x00, + 0x90, 0x00, 0x02, 0x00, 0x00, 0x25, 0x26, 0x20, 0x03, 0x30, 0x03, 0xc0, 0x03, 0xd0, 0x03, 0x04, + 0x03, 0x52, 0xaf, 0x19, 0xbf, 0x19, 0x02, 0x19, 0x25, 0x08, 0x40, 0x09, 0x01, 0x09, 0x55, 0x24, + 0x06, 0x11, 0x4f, 0x00, 0x01, 0x00, 0x55, 0x1c, 0x0a, 0x14, 0x06, 0x13, 0x0e, 0x00, 0x3f, 0x3f, + 0x3f, 0xed, 0x5d, 0x32, 0x3f, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x11, 0x12, + 0x39, 0x2f, 0x5d, 0x33, 0xed, 0x5d, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x5d, 0x31, 0x30, 0x13, + 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x11, + 0x23, 0x35, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0xc9, + 0x23, 0x2c, 0x0b, 0x15, 0x1d, 0x12, 0x60, 0x0f, 0x1c, 0x17, 0x0e, 0x2c, 0x24, 0x60, 0x2f, 0x43, + 0x2b, 0x14, 0x71, 0x6d, 0x73, 0x72, 0x13, 0x2b, 0x44, 0x30, 0x01, 0x78, 0x05, 0x40, 0x47, 0x29, + 0x36, 0x22, 0x10, 0x03, 0x10, 0x23, 0x39, 0x29, 0x46, 0x43, 0x02, 0xfd, 0xe3, 0xa3, 0x04, 0x28, + 0x3f, 0x51, 0x2f, 0x73, 0x7a, 0x7a, 0x73, 0x2f, 0x51, 0x3f, 0x28, 0x04, 0xff, 0xff, 0x00, 0x14, + 0x00, 0x00, 0x01, 0xe1, 0x01, 0xd6, 0x02, 0x06, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0xff, 0x5b, 0x01, 0xda, 0x01, 0xd6, 0x00, 0x1f, 0x00, 0x5d, 0x40, 0x3f, 0x2f, 0x06, 0x3f, 0x06, + 0xcf, 0x06, 0xdf, 0x06, 0x04, 0x06, 0x52, 0x80, 0x07, 0x90, 0x07, 0x02, 0x07, 0x21, 0x20, 0x17, + 0x30, 0x17, 0xc0, 0x17, 0xd0, 0x17, 0x04, 0x17, 0x52, 0x16, 0x20, 0x00, 0x40, 0x0e, 0x50, 0x0e, + 0xe0, 0x0e, 0xf0, 0x0e, 0x04, 0x0e, 0x52, 0x1d, 0x90, 0x0f, 0x01, 0x0f, 0x20, 0x17, 0x0a, 0x1e, + 0x00, 0x1d, 0x57, 0x10, 0x07, 0x0f, 0x0e, 0x0d, 0x07, 0x06, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0xfd, 0x32, 0xc5, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x32, 0xed, 0x5d, 0x32, 0x10, 0xd6, 0xed, 0x5d, + 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x33, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x15, 0x23, 0x35, 0x2e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x11, 0x33, 0x01, 0x29, 0x11, 0x1e, 0x16, 0x0c, 0x60, 0x18, 0x2d, 0x42, 0x2a, 0x60, 0x2a, 0x42, + 0x2d, 0x18, 0x61, 0x0c, 0x15, 0x1e, 0x11, 0x60, 0x52, 0x0c, 0x21, 0x3d, 0x30, 0xea, 0xe0, 0x42, + 0x5e, 0x3e, 0x20, 0x03, 0x9a, 0x9a, 0x03, 0x20, 0x3e, 0x5e, 0x42, 0xe0, 0xea, 0x30, 0x3d, 0x21, + 0x0c, 0x01, 0x13, 0x00, 0x00, 0x01, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x01, 0xe2, 0x00, 0x30, + 0x00, 0x73, 0x40, 0x37, 0x20, 0x0f, 0x30, 0x0f, 0x40, 0x0f, 0xd0, 0x0f, 0x04, 0x0f, 0x52, 0xf0, + 0x06, 0x01, 0x06, 0x00, 0x30, 0x01, 0xc0, 0x30, 0xe0, 0x30, 0x02, 0xaf, 0x30, 0xbf, 0x30, 0x02, + 0x50, 0x30, 0x01, 0x27, 0x30, 0x01, 0x30, 0x52, 0xc0, 0x2f, 0xf0, 0x2f, 0x02, 0x2f, 0x20, 0x26, + 0x30, 0x26, 0x40, 0x26, 0xd0, 0x26, 0x04, 0x26, 0x52, 0x22, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x15, + 0x14, 0x1a, 0x48, 0x1f, 0x31, 0x23, 0x22, 0x0b, 0x2b, 0x57, 0x1a, 0x07, 0x30, 0x17, 0x03, 0x57, + 0x14, 0x07, 0x09, 0x0a, 0x0b, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0xd5, 0xc5, 0x3f, 0xed, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0x2b, 0xc5, 0xfd, 0x5d, 0xde, 0x5d, 0xfd, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0xde, + 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, + 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x35, 0x35, + 0x33, 0x01, 0x2b, 0x11, 0x14, 0x0e, 0x14, 0x1e, 0x23, 0x53, 0x15, 0x21, 0x17, 0x0c, 0x0d, 0x1e, + 0x33, 0x26, 0x21, 0x2d, 0x10, 0x10, 0x31, 0x1d, 0x26, 0x32, 0x1f, 0x0d, 0x2d, 0x2c, 0x52, 0x23, + 0x1e, 0x04, 0x09, 0x0d, 0x09, 0x14, 0x11, 0x60, 0xcc, 0x37, 0x38, 0x3e, 0x31, 0x36, 0x82, 0x39, + 0x25, 0x1c, 0x43, 0x48, 0x4a, 0x22, 0x2b, 0x4e, 0x3c, 0x23, 0x24, 0x23, 0x23, 0x24, 0x23, 0x3c, + 0x4e, 0x2b, 0x45, 0x91, 0x3d, 0x25, 0x39, 0x83, 0x36, 0x15, 0x28, 0x1f, 0x12, 0x38, 0x37, 0x4a, + 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x80, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x03, 0xd7, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0x3d, 0xb4, + 0x19, 0x17, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x7b, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x80, 0x02, 0x37, 0x03, 0xd7, 0xfe, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x28, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x6a, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x80, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xbf, 0xb4, + 0x0e, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x6d, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x80, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xc2, 0x00, 0x00, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc2, 0xb4, 0x0e, 0x0c, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x0e, + 0x20, 0x00, 0x06, 0x50, 0x02, 0x05, 0x18, 0x4f, 0x01, 0x05, 0x0c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x80, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xd5, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, + 0x02, 0xfe, 0xd5, 0xb4, 0x22, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x5a, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x80, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, + 0xfe, 0xaf, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaf, 0xb4, 0x17, 0x15, 0x11, 0x06, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x02, 0x01, 0x01, 0x17, 0x29, 0x11, 0x06, 0x50, 0x02, 0x05, 0x21, 0x4f, 0x01, 0x05, 0x15, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x80, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xd5, 0x00, 0x00, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xd5, 0xb4, 0x2a, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xdb, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd6, 0x16, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x09, 0x29, 0x27, 0x0a, 0x15, + 0x50, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0x1f, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x15, 0x33, 0x31, 0x21, 0x1a, 0x50, 0x01, 0x2c, 0x32, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xdb, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd6, 0x16, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x13, 0x16, 0x14, 0x00, 0x07, + 0x50, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0xfd, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x16, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x15, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xa1, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x00, 0x16, 0x28, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x20, 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xda, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd8, 0x00, 0x00, 0x00, 0x21, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0xff, 0x40, 0x11, 0x19, 0x20, 0x0a, 0x00, 0x50, 0x03, 0x0b, 0x2d, 0x4f, 0x02, 0x0b, + 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xdb, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd6, 0x16, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x15, 0x22, 0x20, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xa1, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x02, 0x14, 0x26, 0x02, 0x0e, 0x50, 0x02, 0x04, 0x1e, 0x4f, 0x01, 0x04, + 0x12, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0x0d, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x0d, 0x14, 0x12, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x26, 0xff, 0xf3, 0x01, 0xce, 0x02, 0xda, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd8, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x17, 0x1e, + 0x02, 0x0e, 0x50, 0x03, 0x04, 0x2b, 0x4f, 0x02, 0x04, 0x20, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0x0d, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x0b, 0x33, 0x31, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x32, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x01, 0x00, 0x97, 0x02, 0x08, 0x01, 0x5c, 0x02, 0xdb, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, + 0x02, 0x04, 0x03, 0x01, 0x7e, 0x00, 0x3f, 0xcd, 0x01, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x01, 0x07, + 0x27, 0x37, 0x01, 0x5c, 0x81, 0x44, 0x71, 0x02, 0x9b, 0x93, 0x32, 0xa1, 0x00, 0x01, 0x00, 0xab, + 0x01, 0xa2, 0x01, 0x49, 0x02, 0x80, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x01, 0x03, + 0x93, 0x00, 0x3f, 0xcd, 0x01, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x49, + 0x47, 0x57, 0x31, 0x02, 0x62, 0xc0, 0x16, 0xc8, 0x00, 0x03, 0x00, 0x26, 0x02, 0x00, 0x01, 0xce, + 0x02, 0xda, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x2f, 0x40, 0x1a, 0x0c, 0x95, 0x12, 0x18, + 0x1a, 0x00, 0x95, 0x90, 0x06, 0x01, 0x0f, 0x06, 0x01, 0x06, 0x1c, 0x1b, 0x19, 0x7e, 0x0f, 0x96, + 0x15, 0x98, 0x03, 0x96, 0x09, 0x98, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xcd, 0x01, 0x10, 0xd6, + 0x5d, 0x5d, 0xfd, 0xd6, 0xd5, 0xd4, 0xed, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x27, 0x07, 0x27, 0x37, 0xab, 0x28, 0x1b, 0x1b, 0x27, 0x27, 0x1b, 0x1b, 0x28, 0x01, 0x23, + 0x28, 0x1a, 0x1b, 0x27, 0x27, 0x1b, 0x1a, 0x28, 0x7c, 0x61, 0x3e, 0x4e, 0x02, 0x5d, 0x1f, 0x23, + 0x23, 0x1f, 0x20, 0x22, 0x22, 0x20, 0x1f, 0x23, 0x23, 0x1f, 0x20, 0x22, 0x22, 0x35, 0xb2, 0x1d, + 0xbd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, + 0xf4, 0x40, 0x09, 0x27, 0x32, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x36, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xf4, 0x40, 0x09, 0x29, + 0x36, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, + 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, + 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x06, 0x2b, 0x28, 0x0a, 0x15, 0x50, 0x03, 0x0d, + 0x3a, 0x4f, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, + 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, + 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0x40, 0x0d, 0x2d, 0x28, 0x0a, 0x15, + 0x50, 0x03, 0x0d, 0x2b, 0x4f, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x05, 0x2b, 0x27, 0x0a, + 0x15, 0x50, 0x03, 0x0d, 0x3a, 0x4f, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x06, 0x2d, 0x27, 0x0a, + 0x15, 0x50, 0x03, 0x0d, 0x2b, 0x4f, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x03, 0x37, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0x40, 0x0d, + 0x32, 0x3c, 0x0a, 0x15, 0x50, 0x03, 0x0d, 0x4e, 0x4f, 0x02, 0x0d, 0x27, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x03, 0x37, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, + 0xff, 0xf4, 0x40, 0x0d, 0x32, 0x3c, 0x0a, 0x15, 0x50, 0x03, 0x0d, 0x3d, 0x4f, 0x02, 0x0d, 0x27, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, 0xff, 0x35, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0x35, 0xb4, 0x17, 0x22, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xff, 0x20, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0x20, 0xb4, + 0x19, 0x26, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xfb, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, 0xfe, 0xbb, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0xbb, 0xb4, 0x1b, 0x18, 0x04, 0x0b, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0xc8, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xfe, 0xc8, 0xb4, 0x1d, 0x18, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x97, 0xfe, 0xe8, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0xe8, + 0xb4, 0x1b, 0x17, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x29, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, + 0xfe, 0xe1, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0xe1, 0xb4, 0x1d, 0x17, 0x04, + 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x77, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0x98, 0xff, 0x09, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0x09, 0xb4, 0x22, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x00, 0x00, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, 0xff, 0x0a, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xff, 0x0a, 0xb4, 0x22, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x89, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x09, 0x31, 0x3c, 0x21, 0x1a, + 0x50, 0x01, 0x2c, 0x40, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xf7, 0x40, 0x09, 0x33, 0x40, 0x21, 0x1a, 0x50, 0x01, 0x2c, 0x31, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x09, 0x35, 0x32, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x44, 0x4f, 0x01, 0x2c, 0x33, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xf7, 0x40, 0x0d, 0x37, 0x32, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x35, 0x4f, 0x01, 0x2c, 0x33, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x08, 0x35, 0x31, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x44, 0x4f, 0x01, 0x2c, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x09, 0x37, 0x31, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x35, 0x4f, 0x01, 0x2c, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0x6b, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xb5, 0xb4, 0x0c, 0x17, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x7b, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xd0, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc5, 0xb4, + 0x0e, 0x1b, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xa4, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, 0xfe, 0x64, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x59, 0xb4, 0x10, 0x0d, 0x00, 0x0a, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbf, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x70, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x65, 0xb4, 0x12, 0x0d, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xc3, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x97, 0xfe, 0x75, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x69, + 0xb4, 0x10, 0x0c, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb2, + 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, + 0xfe, 0x6a, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x5f, 0xb4, 0x12, 0x0c, 0x00, + 0x0a, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x14, 0x1f, 0x00, 0x07, 0x50, 0x01, 0x02, 0x23, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xfe, 0x40, 0x09, 0x16, 0x23, 0x00, 0x07, 0x50, 0x01, 0x02, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x18, 0x15, 0x00, + 0x07, 0x50, 0x02, 0x02, 0x27, 0x4f, 0x01, 0x02, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xfe, 0x40, 0x0d, + 0x1a, 0x15, 0x00, 0x07, 0x50, 0x02, 0x02, 0x18, 0x4f, 0x01, 0x02, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x0f, 0x18, 0x14, 0x00, 0x07, 0x50, 0x02, 0x02, 0x27, 0x4f, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xbe, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x10, 0x1a, 0x14, 0x00, 0x07, 0x50, 0x02, 0x02, 0x18, 0x4f, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x03, 0x37, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xfe, 0x40, 0x0d, 0x1f, 0x29, 0x00, 0x07, 0x50, 0x02, 0x02, 0x3b, 0x4f, 0x01, 0x02, 0x14, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x1a, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xfe, 0x40, 0x0d, 0x1f, 0x29, 0x00, 0x07, 0x50, 0x02, 0x02, 0x2a, + 0x4f, 0x01, 0x02, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x5a, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, + 0xfe, 0xaf, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaf, 0xb4, 0x0c, 0x17, 0x06, 0x00, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x66, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xbb, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, + 0x01, 0xfe, 0xbb, 0xb4, 0x0e, 0x1b, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0x90, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, + 0xfe, 0x50, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x50, 0xb4, 0x10, 0x0d, 0x06, + 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xad, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x5e, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x5e, 0xb4, 0x12, 0x0d, 0x06, 0x00, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb0, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x62, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x62, 0xb4, 0x10, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0x9e, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x56, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x56, + 0xb4, 0x12, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x98, + 0xfe, 0x88, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x88, 0xb4, 0x17, 0x21, 0x06, + 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, 0xfe, 0x88, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x88, 0xb4, 0x17, 0x21, 0x06, 0x00, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xff, 0x40, 0x09, 0x14, 0x1f, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x23, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x16, + 0x23, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, + 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x18, 0x15, 0x0a, 0x00, 0x50, 0x02, 0x0b, + 0x27, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, + 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, 0x1a, 0x15, 0x0a, 0x00, + 0x50, 0x02, 0x0b, 0x18, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x18, 0x14, 0x0a, + 0x00, 0x50, 0x02, 0x0b, 0x27, 0x4f, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x1a, 0x14, 0x0a, + 0x00, 0x50, 0x02, 0x0b, 0x18, 0x4f, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x37, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, + 0x1f, 0x29, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x3b, 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x37, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xff, 0x40, 0x0d, 0x1f, 0x29, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x2a, 0x4f, 0x01, 0x0b, 0x14, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x64, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, 0xfe, 0xb9, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xb9, 0xb4, 0x0c, 0x17, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xb5, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xb5, 0xb4, + 0x0e, 0x1b, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0x99, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, 0xfe, 0x59, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x59, 0xb4, 0x10, 0x0d, 0x00, 0x06, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb5, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x66, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x66, 0xb4, 0x12, 0x0d, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xb9, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x97, 0xfe, 0x6b, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x6a, + 0xb4, 0x10, 0x0c, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xa7, + 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, + 0xfe, 0x5f, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x5f, 0xb4, 0x12, 0x0c, 0x00, + 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0x98, 0xfe, 0x90, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x90, 0xb4, 0x17, 0x21, 0x00, 0x06, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x01, 0xbf, 0x02, 0xd0, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, 0xfe, 0x91, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x91, 0xb4, 0x17, 0x21, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x20, 0x2b, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x2f, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x22, 0x2f, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x11, 0x24, 0x21, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x33, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x00, 0x26, 0x21, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x24, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x11, 0x24, 0x20, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x33, 0x4f, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x11, 0x26, 0x20, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x24, 0x4f, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x7d, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x89, 0xfe, 0xd2, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xd2, 0xb4, + 0x20, 0x2b, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xf3, 0x01, 0xd9, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xb5, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xb5, 0xb4, 0x22, 0x2f, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x99, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x96, 0xfe, 0x59, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x59, + 0xb4, 0x24, 0x21, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb5, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, + 0xfe, 0x66, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x66, 0xb4, 0x26, 0x21, 0x14, + 0x19, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xf3, 0x01, 0xd9, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x81, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x81, 0xb4, 0x24, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xba, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x72, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xfe, 0x72, 0xb4, 0x26, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x12, 0x1d, 0x02, 0x0e, + 0x50, 0x01, 0x04, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x01, 0x14, 0x21, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x12, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x13, 0x16, 0x13, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x25, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x18, 0x13, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x16, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x12, 0x16, 0x12, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x25, 0x4f, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x13, 0x18, 0x12, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x16, 0x4f, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x03, 0x37, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1d, 0x27, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x39, 0x4f, 0x01, 0x04, 0x12, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x03, 0x37, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1d, 0x27, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x28, 0x4f, 0x01, 0x04, 0x12, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x72, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xc7, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc7, 0xb4, + 0x17, 0x24, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xc7, 0x00, 0x00, 0x01, 0xe8, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x78, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x78, 0xb4, 0x1b, 0x16, 0x11, 0x06, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9a, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x52, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x52, 0xb4, 0x1b, 0x15, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xdb, 0x00, 0x00, 0x01, 0xe8, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xa5, 0xfe, 0x6d, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x6d, + 0xb4, 0x20, 0x2a, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, + 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, + 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x31, 0x3c, 0x1e, 0x0e, 0x50, + 0x01, 0x0a, 0x40, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x33, 0x40, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x31, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x11, 0x35, 0x32, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x44, 0x4f, 0x01, 0x0a, 0x33, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xff, 0x40, 0x0d, 0x37, 0x32, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x35, 0x4f, 0x01, 0x0a, 0x33, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x10, 0x35, 0x31, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x44, 0x4f, 0x01, 0x0a, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x11, 0x37, 0x31, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x35, 0x4f, 0x01, 0x0a, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, 0x3c, 0x46, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x58, + 0x4f, 0x01, 0x0a, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, + 0xff, 0xf7, 0x01, 0xdd, 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, + 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, 0x3c, 0x46, 0x1e, 0x0e, + 0x50, 0x02, 0x0a, 0x47, 0x4f, 0x01, 0x0a, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x6b, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc0, 0xb4, + 0x28, 0x33, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x47, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0x9c, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x9c, 0xb4, 0x2a, 0x37, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x7e, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x96, 0xfe, 0x3e, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x3e, + 0xb4, 0x2c, 0x29, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9c, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, + 0xfe, 0x4d, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x4d, 0xb4, 0x2e, 0x29, 0x23, + 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcb, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x7d, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x7d, 0xb4, 0x2c, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbd, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x75, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x75, 0xb4, 0x2e, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x98, 0xfe, 0x91, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x91, + 0xb4, 0x33, 0x3d, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, + 0xfe, 0x90, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x90, 0xb4, 0x33, 0x3d, 0x23, + 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x06, 0x2a, 0x28, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x06, 0x29, 0x27, 0x0a, 0x15, + 0x50, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x09, 0x34, 0x32, 0x21, 0x1a, 0x50, 0x01, 0x2c, 0x33, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x09, 0x33, 0x31, 0x21, 0x1a, + 0x50, 0x01, 0x2c, 0x32, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x10, 0x17, 0x15, 0x00, 0x07, 0x50, 0x01, 0x02, 0x16, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x10, 0x16, 0x14, 0x00, 0x07, + 0x50, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x10, 0x17, 0x15, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x10, 0x16, 0x14, 0x0a, 0x00, + 0x50, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xc1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x11, 0x23, 0x21, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xc1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x11, 0x22, 0x20, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x13, 0x15, 0x13, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x13, 0x14, 0x12, 0x02, 0x0e, + 0x50, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x11, 0x34, 0x32, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x33, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x11, 0x33, 0x31, 0x1e, 0x0e, + 0x50, 0x01, 0x0a, 0x32, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x89, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x42, 0x3c, 0x0a, + 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc1, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x42, 0x3c, 0x0a, + 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x96, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x06, 0x2b, 0x28, 0x0a, 0x15, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa3, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x2d, 0x28, + 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x97, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x05, 0x2b, 0x27, 0x0a, 0x15, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa4, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x06, 0x2d, 0x27, 0x0a, 0x15, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x98, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x32, 0x3c, + 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa5, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x32, 0x3c, + 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x89, 0xfe, 0xff, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x9e, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xc1, 0xfe, 0xf3, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xc5, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x96, 0xfe, 0x85, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xe2, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa3, 0xfe, 0x93, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x97, 0xfe, 0xa9, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xea, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa4, 0xfe, 0xa2, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2e, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0xd0, 0x02, 0x37, 0x04, 0x98, 0xfe, 0xc0, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x2e, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0xd0, 0x02, 0x37, 0x04, 0xa5, 0xfe, 0xc0, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x89, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xcf, 0xb4, 0x2f, 0x1f, 0x00, + 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc1, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xcf, 0xb4, 0x2f, 0x23, 0x00, + 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x96, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x03, 0x02, 0x01, 0x0d, 0x33, 0x15, 0x00, 0x07, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa3, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xfd, 0xb4, 0x33, 0x15, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x97, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x03, 0x02, 0x01, 0x05, 0x33, 0x14, 0x00, 0x07, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xbe, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa4, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x03, 0x02, 0x01, 0x09, 0x33, 0x14, 0x00, 0x07, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x98, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xed, 0xb4, 0x47, 0x29, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa5, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xed, 0xb4, 0x47, 0x29, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0x51, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x89, 0xfe, 0xa6, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x5d, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xc1, 0xfe, 0xb2, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x87, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x96, 0xfe, 0x47, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xa4, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa3, 0xfe, 0x55, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xa7, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x97, 0xfe, 0x59, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0x9b, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa4, 0xfe, 0x53, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xe0, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0xd0, 0x02, 0x37, 0x04, 0x98, 0xfe, 0x72, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xe0, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0xd0, 0x02, 0x37, 0x04, 0xa5, 0xfe, 0x72, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0x89, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0c, 0xb7, 0x02, 0x01, 0x10, 0x31, 0x46, 0x1e, 0x0e, 0x50, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, + 0x00, 0x0c, 0xb7, 0x02, 0x01, 0x10, 0x33, 0x46, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x96, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, 0x40, 0x09, + 0x03, 0x02, 0x01, 0x11, 0x35, 0x32, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xa3, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x03, + 0x02, 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x37, 0x32, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x97, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, 0x40, 0x09, + 0x03, 0x02, 0x01, 0x10, 0x35, 0x31, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xa4, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, 0x40, 0x09, + 0x03, 0x02, 0x01, 0x11, 0x37, 0x31, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x98, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x03, + 0x02, 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x3c, 0x46, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xa5, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x03, + 0x02, 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x3c, 0x46, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x6b, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xb8, 0xb4, + 0x34, 0x3f, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x47, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0x9c, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0x94, 0xb4, 0x36, 0x43, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x7e, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x96, 0xfe, 0x3e, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x36, + 0xb4, 0x38, 0x35, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9c, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, + 0xfe, 0x4d, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x45, 0xb4, 0x3a, 0x35, 0x23, + 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcb, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x7d, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x74, 0xb4, 0x38, 0x34, 0x23, 0x33, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbd, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, + 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x75, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xfe, 0x6d, 0xb4, 0x3a, 0x34, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0xd0, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x98, 0xfe, 0x91, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x89, + 0xb4, 0x3f, 0x49, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0xd0, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, + 0xfe, 0x90, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x88, 0xb4, 0x3f, 0x49, 0x23, + 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, + 0x02, 0xaa, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x02, 0xff, 0xf4, 0x40, 0x09, 0x2b, 0x35, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x27, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0x87, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0xff, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, + 0xf5, 0x40, 0x09, 0x27, 0x28, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xb5, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x03, + 0x02, 0x06, 0x2a, 0x28, 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, + 0xff, 0x56, 0x01, 0xe4, 0x01, 0xe0, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, + 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0xf4, 0xb4, 0x32, 0x2c, 0x0a, 0x15, 0x50, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, 0x02, 0xc1, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc0, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x00, 0x00, + 0x00, 0x0c, 0xb7, 0x03, 0x02, 0x06, 0x29, 0x27, 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x8a, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x06, 0x35, 0x2b, 0x0a, 0x15, + 0x50, 0x02, 0x0d, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xaa, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x8a, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x03, 0x02, 0x06, 0x35, 0x2b, 0x0a, 0x15, 0x50, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x35, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x00, 0x1b, 0x25, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x12, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x17, 0x18, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x67, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0xfe, 0xcf, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xdb, 0xb4, 0x1a, 0x18, 0x04, 0x0b, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x8b, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0xf3, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, + 0x02, 0xfe, 0xff, 0xb4, 0x19, 0x17, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x03, 0x00, 0x09, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x49, 0x40, 0x2c, + 0x02, 0x06, 0x01, 0x18, 0x1a, 0x19, 0x00, 0x07, 0x0b, 0x09, 0x03, 0x0a, 0x12, 0x40, 0x0b, 0x0e, + 0x48, 0x12, 0x52, 0x13, 0x17, 0x1c, 0x03, 0x1b, 0x12, 0x0a, 0x17, 0x57, 0x0c, 0x07, 0x19, 0x73, + 0x1a, 0x00, 0x00, 0x07, 0x0b, 0x08, 0x07, 0x02, 0x06, 0x02, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x12, 0x39, 0x2f, 0x39, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xd6, 0xde, 0xfd, + 0x2b, 0xc6, 0x11, 0x17, 0x39, 0x31, 0x30, 0x37, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, 0x16, + 0x12, 0x17, 0x23, 0x17, 0x2e, 0x03, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, 0x25, 0x33, 0x03, + 0xe7, 0x65, 0x14, 0x65, 0x1c, 0x36, 0x1a, 0x86, 0x1b, 0x35, 0x1a, 0x69, 0xf3, 0x28, 0x32, 0x1b, + 0x0a, 0x60, 0x10, 0x1c, 0xfe, 0x93, 0x4c, 0x26, 0x98, 0x98, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, + 0xcf, 0xb2, 0x0a, 0x05, 0x1c, 0x2a, 0x38, 0x23, 0x01, 0x3a, 0xfe, 0xbb, 0x20, 0x23, 0x04, 0xa2, + 0x01, 0x22, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0x02, 0x08, 0x01, 0x49, 0x02, 0xe6, 0x02, 0x06, + 0x04, 0x89, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, 0xff, 0x56, 0x01, 0x50, 0xff, 0xd3, 0x00, 0x0f, + 0x00, 0x12, 0xb6, 0x05, 0x0f, 0x0c, 0x10, 0x0e, 0x09, 0x92, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, + 0xd5, 0xce, 0x31, 0x30, 0x05, 0x14, 0x1e, 0x02, 0x33, 0x15, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x37, 0x33, 0x01, 0x06, 0x0a, 0x14, 0x1b, 0x11, 0x06, 0x23, 0x0e, 0x38, 0x3d, 0x03, 0x5f, + 0x34, 0x12, 0x15, 0x0b, 0x02, 0x3b, 0x02, 0x05, 0x2e, 0x30, 0x0e, 0x11, 0x00, 0x01, 0x00, 0xab, + 0x02, 0x08, 0x01, 0x49, 0x02, 0xe6, 0x00, 0x0f, 0x00, 0x12, 0xb6, 0x0c, 0x03, 0x00, 0x10, 0x0f, + 0x09, 0xb8, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xde, 0xc5, 0x31, 0x30, 0x13, 0x36, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0xab, 0x16, 0x20, 0x0d, + 0x12, 0x17, 0x24, 0x1c, 0x1d, 0x27, 0x42, 0x33, 0x02, 0x2e, 0x12, 0x21, 0x12, 0x08, 0x1e, 0x12, + 0x1a, 0x21, 0x23, 0x21, 0x28, 0x50, 0x22, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x16, 0x01, 0x8b, + 0x02, 0xaa, 0x00, 0x13, 0x00, 0x1a, 0x40, 0x0b, 0x06, 0x07, 0x0d, 0x0e, 0x14, 0x00, 0x0a, 0x0d, + 0xa7, 0x07, 0xa7, 0x00, 0x3f, 0x3f, 0xde, 0xc5, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0xc5, 0x31, 0x30, + 0x13, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x23, 0x35, 0x34, + 0x3e, 0x02, 0xfa, 0x1f, 0x35, 0x27, 0x16, 0x5a, 0x03, 0x1e, 0x16, 0x16, 0x1e, 0x02, 0x5b, 0x16, + 0x27, 0x35, 0x02, 0xaa, 0x13, 0x24, 0x35, 0x21, 0x07, 0x26, 0x19, 0x19, 0x26, 0x07, 0x21, 0x35, + 0x24, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5e, 0x02, 0x12, 0x01, 0x95, 0x03, 0x37, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x2d, 0x00, 0x4b, 0x40, 0x2d, 0x2d, 0x18, 0x22, 0x23, 0x2e, 0x0c, 0xb3, 0x12, + 0x00, 0xb3, 0x06, 0x2e, 0x18, 0xef, 0x22, 0xff, 0x22, 0x02, 0x22, 0xa0, 0x1d, 0x01, 0x1d, 0x28, + 0x86, 0xd0, 0x15, 0x01, 0x15, 0xb2, 0x00, 0x0f, 0x01, 0x0f, 0xa7, 0xd0, 0x09, 0x01, 0x09, 0xb2, + 0x00, 0x03, 0x01, 0x03, 0xa7, 0x00, 0x3f, 0x5d, 0xed, 0x5d, 0x3f, 0x5d, 0xed, 0x5d, 0x3f, 0xd5, + 0x5d, 0xce, 0x5d, 0x32, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xed, 0x10, 0xdc, 0xd5, 0xd6, 0xc5, 0x31, + 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, + 0x07, 0x23, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x17, 0xd5, 0x24, 0x18, 0x19, 0x22, 0x22, 0x19, + 0x18, 0x24, 0xc0, 0x22, 0x19, 0x18, 0x23, 0x23, 0x18, 0x19, 0x22, 0x54, 0x01, 0x0e, 0x14, 0x19, + 0x0c, 0x0c, 0x19, 0x14, 0x0d, 0x01, 0x45, 0x01, 0x18, 0x27, 0x31, 0x1b, 0x1b, 0x31, 0x27, 0x17, + 0x02, 0x02, 0x4d, 0x1a, 0x21, 0x21, 0x1a, 0x1c, 0x20, 0x20, 0x1c, 0x1a, 0x21, 0x21, 0x1a, 0x1c, + 0x20, 0x20, 0x41, 0x12, 0x18, 0x10, 0x07, 0x07, 0x10, 0x18, 0x12, 0x25, 0x35, 0x23, 0x10, 0x10, + 0x23, 0x35, 0x25, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, 0x02, 0xc1, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xb5, 0x16, 0x00, 0x01, 0x06, 0x04, 0x88, 0xa8, 0x00, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xed, 0xb4, 0x23, 0x15, 0x00, 0x07, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, 0x01, 0xe0, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, + 0xa6, 0xb4, 0x1f, 0x19, 0x00, 0x07, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0xff, 0x56, 0x01, 0xb9, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc0, + 0x16, 0x00, 0x01, 0x06, 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xed, + 0xb4, 0x23, 0x14, 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8a, + 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x22, 0x18, 0x00, 0x07, 0x50, + 0x01, 0x02, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xaa, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x8a, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf0, 0xb4, 0x33, 0x18, 0x00, + 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x39, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xfe, 0xa1, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xa1, 0xb4, 0x0f, 0x0d, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x42, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xfe, 0xaa, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaa, 0xb4, + 0x0e, 0x0c, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xfe, 0x8f, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x9b, 0xb4, 0x0f, 0x0d, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x99, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xa5, 0xb4, + 0x0e, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x71, 0x40, 0x17, 0x19, 0x17, 0x20, 0x14, 0x01, 0x14, + 0x52, 0xa0, 0x12, 0xb0, 0x12, 0xc0, 0x12, 0x03, 0x12, 0xc0, 0x01, 0xd0, 0x01, 0xe0, 0x01, 0x03, + 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x0f, 0x48, 0x01, 0x52, 0x03, 0x00, 0x0a, 0x01, 0x0a, + 0x04, 0xc0, 0x08, 0xd0, 0x08, 0xe0, 0x08, 0x03, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x0b, 0x10, + 0x48, 0x08, 0x52, 0x07, 0x18, 0x12, 0x0a, 0x17, 0x57, 0x0c, 0x07, 0x09, 0x55, 0x04, 0x04, 0x02, + 0x0b, 0x02, 0x08, 0x02, 0x05, 0x08, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, + 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0x2b, 0x5d, 0x32, 0xd6, 0x71, 0x32, 0xfd, 0x2b, + 0x5d, 0xd6, 0x71, 0xfd, 0x5d, 0xde, 0xce, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, + 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0x2e, 0x03, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, 0x01, + 0x39, 0x61, 0x66, 0x60, 0x60, 0x66, 0x01, 0x0e, 0x28, 0x32, 0x1b, 0x0a, 0x60, 0x10, 0x1c, 0x02, + 0x6b, 0xfd, 0x95, 0x01, 0x1a, 0xfe, 0xe6, 0x02, 0x6b, 0xfd, 0xfd, 0xfd, 0x8b, 0x05, 0x1c, 0x2a, + 0x38, 0x23, 0x01, 0x3a, 0xfe, 0xbb, 0x20, 0x23, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, + 0x02, 0x08, 0x01, 0xb4, 0x02, 0xe6, 0x00, 0x03, 0x00, 0x13, 0x00, 0x21, 0x40, 0x0e, 0x01, 0x02, + 0x00, 0x03, 0x10, 0x07, 0x04, 0x0a, 0x02, 0x13, 0x07, 0x00, 0x0d, 0xb8, 0x00, 0x3f, 0xc4, 0xdd, + 0xdd, 0xc6, 0x01, 0x2f, 0xc6, 0xc5, 0xdd, 0xd6, 0xcd, 0xdd, 0xcd, 0x31, 0x30, 0x01, 0x17, 0x07, + 0x27, 0x07, 0x36, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x01, 0x48, 0x6c, 0x3b, 0x7f, 0xba, 0x16, 0x20, 0x0d, 0x12, 0x15, 0x22, 0x1c, 0x1d, 0x20, + 0x3f, 0x30, 0x02, 0xe4, 0xab, 0x2b, 0x9f, 0x7f, 0x12, 0x21, 0x12, 0x08, 0x1e, 0x12, 0x1a, 0x21, + 0x23, 0x21, 0x29, 0x4f, 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4e, 0x02, 0x08, 0x01, 0xa5, + 0x02, 0xe6, 0x00, 0x03, 0x00, 0x13, 0x00, 0x21, 0x40, 0x0e, 0x00, 0x03, 0x01, 0x02, 0x10, 0x04, + 0x0a, 0x14, 0x01, 0x13, 0x07, 0x03, 0x0d, 0xb8, 0x00, 0x3f, 0xc4, 0xdd, 0xdd, 0xc6, 0x01, 0x10, + 0xdc, 0xc6, 0xdd, 0xde, 0xcd, 0xdd, 0xcd, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x05, 0x36, 0x36, + 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0xa5, 0x7e, + 0x3b, 0x6c, 0xfe, 0xf6, 0x15, 0x21, 0x0d, 0x12, 0x16, 0x22, 0x1c, 0x1d, 0x21, 0x40, 0x2f, 0x02, + 0xad, 0x9f, 0x2b, 0xab, 0xb6, 0x12, 0x21, 0x12, 0x08, 0x1e, 0x12, 0x1a, 0x21, 0x23, 0x21, 0x29, + 0x4f, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0x02, 0x06, 0x01, 0x86, 0x03, 0x37, 0x00, 0x15, + 0x00, 0x27, 0x00, 0x36, 0x40, 0x1b, 0x27, 0x16, 0x19, 0x1c, 0xe0, 0x22, 0x01, 0x22, 0x00, 0x0b, + 0xe0, 0x0a, 0x01, 0x0a, 0x00, 0x15, 0x27, 0x19, 0x1f, 0x15, 0xff, 0x0a, 0x01, 0x0a, 0x10, 0x05, + 0x1f, 0x00, 0x2f, 0xde, 0xcd, 0xde, 0x5d, 0xc0, 0x10, 0xdd, 0xcd, 0x01, 0x2f, 0xdd, 0xdc, 0x5d, + 0xcd, 0x10, 0xd6, 0x5d, 0xdd, 0xc5, 0xc6, 0x32, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x0e, + 0x02, 0x07, 0x23, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x36, 0x36, 0x37, 0x26, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x41, 0x01, 0x0d, 0x14, + 0x19, 0x0c, 0x0c, 0x19, 0x14, 0x0d, 0x01, 0x45, 0x01, 0x18, 0x27, 0x31, 0x1b, 0x1b, 0x31, 0x27, + 0x17, 0x02, 0xd1, 0x0b, 0x18, 0x09, 0x11, 0x0c, 0x1a, 0x1a, 0x15, 0x22, 0x07, 0x14, 0x22, 0x1c, + 0x02, 0xaa, 0x12, 0x18, 0x10, 0x07, 0x07, 0x10, 0x18, 0x12, 0x25, 0x35, 0x23, 0x10, 0x10, 0x23, + 0x35, 0x25, 0x7f, 0x09, 0x15, 0x0b, 0x07, 0x18, 0x0d, 0x12, 0x1d, 0x1a, 0x1b, 0x0c, 0x19, 0x1b, + 0x21, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xaa, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xdc, 0x40, 0x09, 0x18, 0x22, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0x87, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xde, 0x40, 0x09, 0x14, + 0x15, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x15, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xda, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb3, + 0xef, 0x00, 0x00, 0x21, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xee, 0x40, 0x11, 0x19, 0x20, 0x0a, + 0x00, 0x50, 0x03, 0x0b, 0x2e, 0x4f, 0x02, 0x0b, 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x15, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xda, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd8, 0xef, 0x00, 0x00, 0x21, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xee, 0x40, 0x11, 0x19, 0x20, 0x0a, 0x00, 0x50, 0x03, 0x0b, + 0x2d, 0x4f, 0x02, 0x0b, 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xaa, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8a, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xdc, 0x40, 0x09, 0x22, 0x18, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x37, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x8b, 0xdd, 0x00, 0x00, 0x1e, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xdb, 0x40, + 0x0e, 0x19, 0x20, 0x0a, 0x00, 0x50, 0x03, 0x02, 0x0b, 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, + 0x2b, 0x34, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x35, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x10, 0x1a, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0c, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x12, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x0c, 0x0d, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x25, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x43, 0xfe, 0x8d, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x98, 0xb4, + 0x0f, 0x0d, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x87, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x92, 0xb4, 0x0e, 0x0c, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0x00, 0x02, 0x00, 0x4f, 0x02, 0x08, 0x01, 0xa5, 0x02, 0xe6, 0x00, 0x03, 0x00, 0x13, 0x00, 0x1c, + 0x40, 0x0c, 0x01, 0x03, 0x0d, 0x13, 0x07, 0x14, 0x0a, 0x04, 0x7e, 0x00, 0x02, 0x7e, 0x00, 0x3f, + 0xc5, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xc5, 0xd5, 0xde, 0xc5, 0x31, 0x30, 0x01, 0x17, 0x07, 0x27, + 0x07, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x17, + 0x01, 0x39, 0x6c, 0x3b, 0x7f, 0x2e, 0x30, 0x3e, 0x20, 0x1d, 0x1c, 0x22, 0x15, 0x12, 0x0c, 0x21, + 0x16, 0x02, 0xe4, 0xab, 0x2b, 0x9f, 0xa5, 0x20, 0x52, 0x28, 0x21, 0x23, 0x21, 0x1a, 0x12, 0x1e, + 0x08, 0x12, 0x21, 0x12, 0x00, 0x02, 0x00, 0x48, 0x02, 0x08, 0x01, 0xac, 0x02, 0xe6, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x1c, 0x40, 0x0c, 0x00, 0x02, 0x13, 0x0d, 0x07, 0x14, 0x0a, 0x04, 0x7e, 0x03, + 0x01, 0x7e, 0x00, 0x3f, 0xc5, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0xde, 0xcd, 0x31, 0x30, + 0x01, 0x07, 0x27, 0x37, 0x07, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x17, 0x01, 0xac, 0x7f, 0x3b, 0x6c, 0xa7, 0x30, 0x3f, 0x21, 0x1d, 0x1c, 0x22, + 0x16, 0x12, 0x0d, 0x21, 0x15, 0x02, 0xad, 0x9f, 0x2b, 0xab, 0xdc, 0x20, 0x52, 0x28, 0x21, 0x23, + 0x21, 0x1a, 0x12, 0x1e, 0x08, 0x12, 0x21, 0x12, 0x00, 0x02, 0x00, 0x6e, 0x02, 0x06, 0x01, 0x86, + 0x03, 0x37, 0x00, 0x15, 0x00, 0x27, 0x00, 0x2b, 0x40, 0x14, 0x27, 0x24, 0x21, 0xb0, 0x1b, 0x01, + 0x1b, 0x0b, 0x15, 0x00, 0x0a, 0x0b, 0x28, 0x16, 0x1e, 0x05, 0x15, 0x0b, 0x10, 0x86, 0x00, 0x3f, + 0xc5, 0xc5, 0xd5, 0xde, 0xc5, 0x01, 0x10, 0xde, 0xd5, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xc5, 0xd5, + 0xce, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x23, 0x3e, 0x03, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x07, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x16, 0x17, 0x01, 0x41, 0x01, 0x0d, 0x14, 0x19, 0x0c, 0x0c, 0x19, 0x14, 0x0d, 0x01, 0x45, + 0x01, 0x18, 0x27, 0x31, 0x1b, 0x1b, 0x31, 0x27, 0x17, 0x02, 0x68, 0x1b, 0x23, 0x14, 0x07, 0x22, + 0x15, 0x1a, 0x1a, 0x0c, 0x11, 0x09, 0x18, 0x0b, 0x02, 0xaa, 0x12, 0x18, 0x10, 0x07, 0x07, 0x10, + 0x18, 0x12, 0x25, 0x35, 0x23, 0x10, 0x10, 0x23, 0x35, 0x25, 0xa4, 0x13, 0x21, 0x1b, 0x19, 0x0c, + 0x1b, 0x1a, 0x1d, 0x12, 0x0d, 0x18, 0x07, 0x0b, 0x15, 0x09, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, + 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x16, 0x20, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x12, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0x87, 0x02, 0x26, + 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x12, 0x13, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x26, + 0xff, 0xf3, 0x01, 0xce, 0x02, 0xda, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb3, + 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x17, 0x1e, 0x02, 0x0e, 0x50, 0x03, + 0x04, 0x2c, 0x4f, 0x02, 0x04, 0x20, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x26, 0xff, 0xf3, 0x01, 0xce, 0x02, 0xda, 0x02, 0x26, + 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd8, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, + 0x01, 0x01, 0x17, 0x1e, 0x02, 0x0e, 0x50, 0x03, 0x04, 0x2b, 0x4f, 0x02, 0x04, 0x20, 0x4f, 0x01, + 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd5, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, + 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xf0, 0x40, 0x09, 0x1e, 0x29, 0x05, 0x0b, 0x50, + 0x02, 0x08, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x02, 0xff, 0xf0, 0x40, 0x09, 0x20, 0x2d, 0x05, 0x0b, 0x50, 0x02, 0x08, 0x1e, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xaa, 0x02, 0x26, + 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, + 0x20, 0x16, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x18, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, + 0xff, 0xf3, 0x01, 0xbf, 0x03, 0x37, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8b, + 0x00, 0x00, 0x00, 0x1b, 0x40, 0x12, 0x03, 0x02, 0x01, 0x00, 0x17, 0x1e, 0x02, 0x0e, 0x50, 0x03, + 0x02, 0x04, 0x20, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x35, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x19, 0x23, + 0x11, 0x06, 0x50, 0x01, 0x05, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x03, 0x12, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x15, 0x16, 0x11, 0x06, 0x50, 0x01, + 0x05, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x01, 0xe8, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xfe, 0x9f, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaa, 0xb4, 0x18, 0x16, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x8f, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x9a, 0xb4, + 0x17, 0x15, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x57, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xac, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0x9f, 0xb4, 0x1c, 0x29, 0x09, 0x02, 0x50, 0x2b, 0x34, 0x00, + 0x00, 0x03, 0x00, 0x26, 0x02, 0x00, 0x01, 0xce, 0x02, 0xda, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, + 0x00, 0x29, 0x40, 0x15, 0x0c, 0x95, 0x12, 0x19, 0x1b, 0x1a, 0x00, 0x95, 0x06, 0x1c, 0x18, 0x1a, + 0x7e, 0x0f, 0x96, 0x15, 0x98, 0x03, 0x96, 0x09, 0x98, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0xfd, 0xce, 0xd4, 0xd5, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x27, 0x17, 0x07, 0x27, 0xab, 0x28, 0x1b, 0x1b, 0x27, 0x27, 0x1b, 0x1b, 0x28, + 0x01, 0x23, 0x28, 0x1a, 0x1b, 0x27, 0x27, 0x1b, 0x1a, 0x28, 0xdc, 0x4e, 0x3e, 0x61, 0x02, 0x5d, + 0x1f, 0x23, 0x23, 0x1f, 0x20, 0x22, 0x22, 0x20, 0x1f, 0x23, 0x23, 0x1f, 0x20, 0x22, 0x22, 0x5d, + 0xbd, 0x1d, 0xb2, 0x00, 0xff, 0xff, 0x00, 0x26, 0x02, 0x00, 0x01, 0xce, 0x02, 0xda, 0x02, 0x06, + 0x03, 0xd8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x85, 0x02, 0x05, 0x01, 0x6f, 0x02, 0xc1, 0x00, 0x03, + 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x00, 0x02, 0x7e, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, + 0x31, 0x30, 0x13, 0x17, 0x07, 0x27, 0xbe, 0xb1, 0x2e, 0xbc, 0x02, 0xc1, 0x75, 0x47, 0x60, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x88, 0x1b, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x44, 0x42, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x01, 0xe2, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x1a, 0x3c, 0x36, 0x1e, 0x0e, 0x50, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xc1, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0x88, 0x1b, 0x00, 0x01, 0x06, 0x04, 0xc0, 0x24, 0x00, + 0x00, 0x0c, 0xb7, 0x02, 0x01, 0x23, 0x43, 0x41, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x3f, + 0x35, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x37, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, + 0xff, 0x56, 0x01, 0xdd, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0x88, + 0x1b, 0x00, 0x01, 0x06, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, + 0xb4, 0x4f, 0x45, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x14, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0xfe, 0x7c, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0x88, 0xb4, 0x23, 0x21, 0x14, 0x19, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0xac, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, + 0x02, 0xfe, 0xb8, 0xb4, 0x22, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xfa, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0xfe, 0x62, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x6e, 0xb4, 0x2b, 0x29, 0x23, 0x0e, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x9b, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, + 0x01, 0xfe, 0xa7, 0xb4, 0x2a, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x02, 0x00, 0x09, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x79, 0x00, 0x27, 0x00, 0x33, 0x01, 0x37, 0xb9, 0x00, 0x33, 0xff, + 0xc0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x25, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x25, 0xb8, + 0xff, 0xc0, 0x40, 0x15, 0x0d, 0x0e, 0x00, 0x4c, 0x24, 0x40, 0x10, 0x00, 0x4d, 0x24, 0x40, 0x0d, + 0x0e, 0x00, 0x4c, 0x0b, 0x40, 0x0e, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x09, 0x40, 0x10, 0x00, 0x4d, 0x08, 0xb8, + 0xff, 0xf0, 0xb3, 0x16, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x06, 0xb8, + 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x16, 0x0b, 0x00, 0x4d, 0x04, + 0x33, 0x14, 0x33, 0x02, 0xa4, 0x33, 0xb4, 0x33, 0x02, 0x0b, 0x33, 0x1b, 0x33, 0x8b, 0x33, 0x03, + 0x33, 0x2f, 0xb8, 0xff, 0xc0, 0xb3, 0x13, 0x1a, 0x48, 0x2f, 0xb8, 0xff, 0xc0, 0x40, 0x66, 0x0b, + 0x10, 0x48, 0x2f, 0x52, 0x34, 0x2d, 0x01, 0x20, 0x2d, 0x01, 0x02, 0x00, 0x2d, 0x10, 0x2d, 0x02, + 0x2d, 0x12, 0x40, 0x18, 0x00, 0x4d, 0x12, 0x40, 0x0c, 0x00, 0x4d, 0x4f, 0x12, 0x5f, 0x12, 0xcf, + 0x12, 0xdf, 0x12, 0x04, 0x12, 0x52, 0x09, 0x40, 0x06, 0x01, 0x06, 0x30, 0x0b, 0x50, 0x0b, 0x90, + 0x0b, 0x03, 0x0b, 0x2f, 0x0d, 0x01, 0x0d, 0xaf, 0x21, 0x01, 0x00, 0x21, 0x10, 0x21, 0x20, 0x21, + 0x03, 0x21, 0x25, 0xc0, 0x1c, 0xd0, 0x1c, 0x02, 0x1c, 0x52, 0xe0, 0x00, 0xf0, 0x00, 0x02, 0x00, + 0x25, 0x24, 0x34, 0x2f, 0x0a, 0x33, 0x57, 0x28, 0x09, 0x25, 0x55, 0x22, 0x08, 0x09, 0x55, 0x0b, + 0x08, 0x17, 0x57, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, + 0x10, 0xd6, 0xdd, 0xd5, 0x5d, 0xed, 0x5d, 0x10, 0xd5, 0x5d, 0x5d, 0xde, 0x5d, 0xd5, 0x5d, 0xd4, + 0x5d, 0xcd, 0xed, 0x5d, 0x2b, 0x2b, 0xde, 0x5d, 0x5f, 0x5d, 0x5d, 0xed, 0x2b, 0x2b, 0xc4, 0x5d, + 0x5d, 0x71, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, + 0x35, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x17, + 0x15, 0x23, 0x35, 0x33, 0x26, 0x26, 0x01, 0x2e, 0x03, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, + 0x0e, 0x54, 0x49, 0x48, 0x54, 0x1b, 0x22, 0x40, 0x8e, 0x08, 0x0f, 0x0b, 0x07, 0x06, 0x0e, 0x16, + 0x10, 0x10, 0x16, 0x0e, 0x06, 0x06, 0x0b, 0x0f, 0x08, 0x90, 0x42, 0x21, 0x1c, 0x01, 0xe1, 0x28, + 0x32, 0x1b, 0x0a, 0x60, 0x10, 0x1c, 0x01, 0x62, 0x8c, 0x8b, 0x8b, 0x8c, 0x42, 0x86, 0x3d, 0x5d, + 0x57, 0x10, 0x35, 0x44, 0x4f, 0x2b, 0x26, 0x45, 0x34, 0x1e, 0x1f, 0x35, 0x46, 0x27, 0x2a, 0x4f, + 0x42, 0x34, 0x10, 0x57, 0x5d, 0x3d, 0x89, 0xfe, 0xd3, 0x05, 0x1c, 0x2a, 0x38, 0x23, 0x01, 0x3a, + 0xfe, 0xbb, 0x20, 0x23, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x85, 0x02, 0x05, 0x01, 0x6f, + 0x02, 0xc1, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x03, 0x01, 0x7e, 0x00, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x6f, 0xbc, 0x2e, 0xb1, 0x02, + 0x65, 0x60, 0x47, 0x75, 0x00, 0x01, 0x00, 0xab, 0x02, 0x08, 0x01, 0x49, 0x02, 0xe6, 0x00, 0x0f, + 0x00, 0x12, 0xb6, 0x0f, 0x09, 0x03, 0x10, 0x06, 0x00, 0x7e, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, + 0xd5, 0xce, 0x31, 0x30, 0x01, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x17, 0x01, 0x20, 0x33, 0x42, 0x27, 0x1d, 0x1c, 0x24, 0x17, 0x12, 0x0d, 0x20, + 0x16, 0x02, 0x08, 0x22, 0x50, 0x28, 0x21, 0x23, 0x21, 0x1a, 0x12, 0x1e, 0x08, 0x12, 0x21, 0x12, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x89, 0xfe, 0xff, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, + 0xb1, 0x03, 0x02, 0xb8, 0xff, 0x91, 0xb4, 0x17, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0xa7, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0xc1, 0xfe, 0xfc, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, + 0xb1, 0x03, 0x02, 0xb8, 0xff, 0x8f, 0xb4, 0x19, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0xd7, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x96, 0xfe, 0x97, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, + 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x27, 0xb4, 0x1b, 0x30, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf4, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa3, 0xfe, 0xa5, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x36, 0xb4, 0x1d, 0x30, 0x04, 0x0b, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1b, 0xff, 0x56, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0x97, 0xfe, 0xcd, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x49, 0xb4, + 0x1b, 0x30, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0e, + 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa4, + 0xfe, 0xc6, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, + 0xb8, 0xff, 0x43, 0xb4, 0x1d, 0x30, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x5c, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x98, 0xfe, 0xee, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, + 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x6a, 0xb4, 0x22, 0x44, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa5, 0xfe, 0xef, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x6a, 0xb4, 0x22, 0x44, 0x04, 0x0b, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x5a, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0x89, 0xfe, 0xaf, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x6d, 0xb4, 0x0c, + 0x21, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0x66, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xc1, 0xfe, 0xbb, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x73, 0xb4, 0x0e, + 0x21, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0xfe, 0x90, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0x96, 0xfe, 0x50, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x08, 0xb4, + 0x10, 0x25, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xad, + 0xff, 0x56, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa3, + 0xfe, 0x5e, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0x17, 0xb4, 0x12, 0x25, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xb0, 0xff, 0x56, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x97, 0xfe, 0x62, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x18, 0xb4, 0x10, 0x25, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9e, 0xff, 0x56, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa4, 0xfe, 0x56, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x0f, 0xb4, 0x12, 0x25, 0x06, 0x00, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0x98, 0xfe, 0x88, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x3b, 0xb4, + 0x17, 0x39, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, + 0xff, 0x56, 0x01, 0xc7, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa5, + 0xfe, 0x88, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0x3b, 0xb4, 0x17, 0x39, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x6b, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x76, 0xb4, 0x28, 0x3d, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x47, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0xc1, 0xfe, 0x9c, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x64, 0xb4, 0x2a, 0x3d, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x7e, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x96, 0xfe, 0x3e, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xfe, 0xff, 0xb4, 0x2c, 0x41, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9c, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa3, 0xfe, 0x4d, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x0e, 0xb4, 0x2e, 0x41, 0x23, 0x0e, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcb, 0xff, 0x56, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0x97, 0xfe, 0x7d, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x26, 0xb4, + 0x2c, 0x41, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbd, + 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa4, + 0xfe, 0x75, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0x1f, 0xb4, 0x2e, 0x41, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x98, 0xfe, 0x91, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x40, 0xb4, 0x33, 0x55, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa5, 0xfe, 0x90, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x3f, 0xb4, 0x33, 0x55, 0x23, 0x0e, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0xff, 0x56, 0x01, 0xeb, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0a, + 0xb6, 0x02, 0x1b, 0x22, 0x1c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0xff, 0x56, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x24, 0x17, 0x11, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x79, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x24, 0x33, 0x2d, 0x23, 0x0e, 0x50, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xec, 0x02, 0x6b, 0x00, 0x23, + 0x00, 0x7f, 0x40, 0x0d, 0x1c, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x19, 0x40, 0x09, 0x0a, 0x00, 0x4c, + 0x17, 0xb8, 0xff, 0xe0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x17, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, + 0x4d, 0x0f, 0xb8, 0xff, 0xe0, 0x40, 0x31, 0x0c, 0x00, 0x4d, 0x11, 0x16, 0x25, 0x1c, 0x1c, 0x24, + 0x25, 0x0c, 0x06, 0x25, 0x17, 0x1d, 0x23, 0x0e, 0x0b, 0x53, 0x21, 0x00, 0x23, 0x04, 0x24, 0x17, + 0x08, 0x16, 0x08, 0x1d, 0x0e, 0x22, 0x40, 0x0d, 0x10, 0x48, 0x22, 0x55, 0x0b, 0x23, 0x08, 0x4f, + 0x04, 0x6f, 0x04, 0x02, 0x04, 0x55, 0x05, 0x02, 0x00, 0x3f, 0xfd, 0x5d, 0x32, 0xde, 0x32, 0xfd, + 0x2b, 0x32, 0xc6, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd0, 0xd5, 0x32, 0xed, 0x32, 0x10, 0xd0, 0xc5, + 0x10, 0xd6, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x26, 0x26, 0x23, 0x23, 0x35, 0x21, 0x07, 0x23, 0x16, 0x16, 0x17, 0x33, 0x07, 0x23, + 0x06, 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x35, 0x33, 0x32, 0x36, 0x37, 0x23, + 0x35, 0x01, 0x0f, 0x0b, 0x3a, 0x2e, 0x6e, 0x01, 0xbe, 0x11, 0x73, 0x0e, 0x11, 0x05, 0x45, 0x11, + 0x3a, 0x13, 0x68, 0x4a, 0x19, 0x38, 0x34, 0x2e, 0x10, 0x8e, 0x16, 0x34, 0x34, 0x34, 0x16, 0x3f, + 0x40, 0x44, 0x14, 0xd7, 0x01, 0xd3, 0x27, 0x18, 0x59, 0x59, 0x0d, 0x21, 0x11, 0x58, 0x44, 0x44, + 0x0a, 0x19, 0x3d, 0x3f, 0x3c, 0x18, 0x1f, 0x3f, 0x3b, 0x36, 0x15, 0x5a, 0x1a, 0x23, 0x58, 0x00, + 0x00, 0x07, 0x00, 0x39, 0x01, 0x34, 0x01, 0xba, 0x02, 0xb5, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, + 0x00, 0x3b, 0x00, 0x4e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x29, 0x40, 0x13, 0x0a, 0x00, 0x0a, 0x00, + 0x6e, 0x6f, 0x3c, 0x4f, 0x54, 0x4a, 0x54, 0x05, 0x05, 0x54, 0x4a, 0x03, 0x6f, 0x0f, 0x10, 0x00, + 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x17, + 0x06, 0x06, 0x17, 0x16, 0x16, 0x37, 0x36, 0x36, 0x27, 0x26, 0x26, 0x27, 0x34, 0x36, 0x37, 0x27, + 0x06, 0x07, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x37, 0x26, 0x26, 0x37, 0x32, 0x16, 0x17, 0x37, + 0x26, 0x26, 0x27, 0x06, 0x27, 0x26, 0x26, 0x35, 0x26, 0x23, 0x22, 0x07, 0x17, 0x36, 0x17, 0x22, + 0x27, 0x07, 0x16, 0x33, 0x32, 0x37, 0x34, 0x36, 0x37, 0x36, 0x17, 0x36, 0x36, 0x37, 0x27, 0x06, + 0x06, 0x37, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x06, 0x16, 0x01, 0xba, 0x1e, + 0x35, 0x46, 0x28, 0x28, 0x46, 0x34, 0x1e, 0x1e, 0x34, 0x46, 0x28, 0x28, 0x46, 0x35, 0x1e, 0xfe, + 0xbd, 0x0b, 0x0f, 0x0f, 0x0b, 0x0b, 0x0f, 0x0f, 0xac, 0x09, 0x06, 0x05, 0x06, 0x14, 0x0a, 0x09, + 0x06, 0x05, 0x06, 0x15, 0x89, 0x13, 0x0e, 0x13, 0x24, 0x0b, 0x0e, 0x0e, 0x0b, 0x24, 0x13, 0x0e, + 0x13, 0x4b, 0x1e, 0x2b, 0x02, 0x25, 0x02, 0x12, 0x0e, 0x0f, 0x10, 0x06, 0x0a, 0x0d, 0x12, 0x1b, + 0x16, 0x12, 0x10, 0x0f, 0x0f, 0x10, 0x12, 0x16, 0x1b, 0x12, 0x0d, 0x0a, 0x06, 0x10, 0x0f, 0x0e, + 0x12, 0x02, 0x25, 0x02, 0x2b, 0x17, 0x09, 0x15, 0x06, 0x05, 0x06, 0x09, 0x0a, 0x14, 0x06, 0x05, + 0x06, 0x01, 0xf4, 0x28, 0x46, 0x34, 0x1e, 0x1e, 0x34, 0x46, 0x28, 0x28, 0x46, 0x35, 0x1e, 0x1e, + 0x35, 0x46, 0x0e, 0x0f, 0x0b, 0x0a, 0x0f, 0x0f, 0x0a, 0x0b, 0x0f, 0x75, 0x05, 0x14, 0x0a, 0x09, + 0x06, 0x06, 0x05, 0x15, 0x09, 0x0a, 0x04, 0x56, 0x14, 0x1f, 0x0b, 0x20, 0x19, 0x29, 0x09, 0x13, + 0x11, 0x0b, 0x28, 0x19, 0x20, 0x0b, 0x1f, 0x5f, 0x28, 0x1d, 0x01, 0x15, 0x25, 0x0e, 0x05, 0x07, + 0x05, 0x0d, 0x08, 0x04, 0x0c, 0x1f, 0x07, 0x97, 0x07, 0x1f, 0x0c, 0x04, 0x08, 0x0d, 0x05, 0x07, + 0x05, 0x0e, 0x25, 0x15, 0x01, 0x1d, 0x28, 0xa7, 0x06, 0x05, 0x0a, 0x09, 0x15, 0x05, 0x05, 0x06, + 0x08, 0x0b, 0x13, 0x00, 0x00, 0x0e, 0xff, 0x5b, 0x00, 0x00, 0x02, 0x99, 0x02, 0xb4, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x07, 0xaf, 0x40, 0x1f, 0x33, 0x10, + 0x09, 0x00, 0x4d, 0x32, 0x18, 0x09, 0x00, 0x4d, 0x2b, 0x08, 0x09, 0x00, 0x4d, 0x2a, 0x08, 0x09, + 0x00, 0x4d, 0x27, 0x10, 0x09, 0x00, 0x4d, 0x26, 0x10, 0x09, 0x00, 0x4d, 0x23, 0xb8, 0xff, 0xf0, + 0xb3, 0x09, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xf8, 0x40, 0x0e, 0x09, 0x00, 0x4d, 0x21, 0x10, 0x09, + 0x00, 0x4d, 0x20, 0x08, 0x09, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xf8, 0x40, 0xb9, 0x09, 0x00, 0x4d, + 0x1d, 0x10, 0x09, 0x00, 0x4d, 0x1c, 0x18, 0x09, 0x00, 0x4d, 0x06, 0x1b, 0x26, 0x1b, 0x36, 0x1b, + 0x46, 0x1b, 0x66, 0x1b, 0x86, 0x1b, 0x06, 0x3d, 0x07, 0x1b, 0x01, 0x09, 0x06, 0x1a, 0x26, 0x1a, + 0x36, 0x1a, 0x46, 0x1a, 0x66, 0x1a, 0x86, 0x1a, 0x06, 0x3d, 0x07, 0x1a, 0x01, 0x09, 0x06, 0x13, + 0x16, 0x13, 0x26, 0x13, 0x66, 0x13, 0x04, 0x06, 0x12, 0x16, 0x12, 0x26, 0x12, 0x66, 0x12, 0x04, + 0x3d, 0x09, 0x05, 0x01, 0x09, 0x04, 0x01, 0x3e, 0x09, 0x01, 0x19, 0x01, 0x02, 0x09, 0x00, 0x19, + 0x00, 0x02, 0x41, 0x07, 0x26, 0x01, 0x07, 0x25, 0x01, 0x07, 0x22, 0x01, 0x07, 0x21, 0x01, 0x09, + 0x1f, 0x01, 0x09, 0x1c, 0x78, 0x09, 0x49, 0x09, 0x17, 0x69, 0x17, 0x02, 0x09, 0x14, 0x69, 0x14, + 0x02, 0x06, 0x0e, 0x36, 0x0e, 0x66, 0x0e, 0x03, 0x06, 0x0d, 0x36, 0x0d, 0x66, 0x0d, 0x03, 0x09, + 0x0b, 0x39, 0x0b, 0x02, 0x09, 0x08, 0x39, 0x08, 0x02, 0x3d, 0x9a, 0x31, 0xaa, 0x31, 0x02, 0x69, + 0x31, 0x79, 0x31, 0x89, 0x31, 0x03, 0x31, 0x40, 0x0a, 0x0e, 0x48, 0x0a, 0x31, 0x01, 0x31, 0x2f, + 0x80, 0x34, 0x3b, 0x48, 0x2f, 0x7f, 0x28, 0x8f, 0x28, 0x02, 0x5e, 0x28, 0x6e, 0x28, 0x02, 0x4d, + 0x28, 0x01, 0x3e, 0x28, 0x01, 0x28, 0xb8, 0x01, 0x80, 0x40, 0x4e, 0x28, 0x2b, 0x48, 0x9a, 0x28, + 0xaa, 0x28, 0x02, 0x69, 0x28, 0x79, 0x28, 0x89, 0x28, 0x03, 0x28, 0x40, 0x0a, 0x0e, 0x48, 0x28, + 0xb0, 0x09, 0x49, 0x28, 0x24, 0x80, 0x34, 0x3b, 0x48, 0x7f, 0x24, 0x8f, 0x24, 0x02, 0x5e, 0x24, + 0x6e, 0x24, 0x02, 0x4d, 0x24, 0x01, 0x2e, 0x24, 0x3e, 0x24, 0x02, 0x0d, 0x24, 0x1d, 0x24, 0x02, + 0xfd, 0x24, 0x01, 0x9a, 0x24, 0xaa, 0x24, 0x02, 0x69, 0x24, 0x79, 0x24, 0x89, 0x24, 0x03, 0x24, + 0x40, 0x0a, 0x0e, 0x48, 0x0a, 0x24, 0x01, 0x24, 0x36, 0xb8, 0xff, 0x80, 0x40, 0x09, 0x34, 0x3b, + 0x48, 0x07, 0x36, 0x01, 0x36, 0x35, 0x32, 0xb8, 0xff, 0x80, 0x40, 0x0c, 0x0d, 0x13, 0x48, 0x17, + 0x32, 0x27, 0x32, 0x37, 0x32, 0x03, 0x32, 0x2b, 0xb8, 0xfe, 0x00, 0x40, 0x13, 0x2d, 0x31, 0x48, + 0x31, 0x2b, 0x01, 0x20, 0x2b, 0x01, 0x01, 0x2b, 0x11, 0x2b, 0x02, 0xf1, 0x2b, 0x01, 0x00, 0x2b, + 0xb8, 0xff, 0x80, 0x40, 0x0c, 0x0d, 0x13, 0x48, 0x10, 0x2b, 0x20, 0x2b, 0x30, 0x2b, 0x03, 0x2b, + 0x27, 0xb8, 0xfe, 0x00, 0xb3, 0x2d, 0x31, 0x48, 0x27, 0xb8, 0xfe, 0x40, 0xb3, 0x28, 0x2c, 0x48, + 0x27, 0xb8, 0xff, 0x80, 0x40, 0xff, 0x0d, 0x13, 0x48, 0x10, 0x27, 0x20, 0x27, 0x30, 0x27, 0x03, + 0x27, 0x1c, 0x0c, 0x20, 0x01, 0x09, 0x03, 0x20, 0x22, 0x2f, 0x15, 0x8f, 0x15, 0x02, 0x09, 0x15, + 0x01, 0x3b, 0x8f, 0x15, 0x9f, 0x15, 0xff, 0x15, 0x03, 0x5e, 0x15, 0x01, 0xbd, 0x15, 0xed, 0x15, + 0xfd, 0x15, 0x03, 0x5b, 0x15, 0x01, 0x4c, 0x15, 0x01, 0x1b, 0x15, 0x01, 0xaa, 0x15, 0xba, 0x15, + 0x02, 0x79, 0x15, 0x01, 0x08, 0x15, 0x18, 0x15, 0x02, 0x0a, 0x15, 0x09, 0x13, 0x01, 0x3b, 0x13, + 0x0f, 0x0c, 0x3f, 0x0c, 0x6f, 0x0c, 0x03, 0x3d, 0x4f, 0x0c, 0x8f, 0x0c, 0xbf, 0x0c, 0xef, 0x0c, + 0x04, 0x1e, 0x0c, 0x01, 0xad, 0x0c, 0xed, 0x0c, 0x02, 0x7b, 0x0c, 0x01, 0x4c, 0x0c, 0x01, 0x0b, + 0x0c, 0x01, 0xaa, 0x0c, 0xda, 0x0c, 0x02, 0x39, 0x0c, 0x69, 0x0c, 0x02, 0x08, 0x0c, 0x01, 0x0b, + 0x0c, 0x2f, 0x08, 0x5f, 0x08, 0x02, 0x09, 0x08, 0x01, 0x3b, 0xe9, 0x08, 0x01, 0x8f, 0x08, 0xbf, + 0x08, 0x02, 0x1e, 0x08, 0x01, 0xed, 0x08, 0x01, 0x7b, 0x08, 0x01, 0x4c, 0x08, 0x01, 0xaa, 0x08, + 0xda, 0x08, 0x02, 0x08, 0x08, 0x38, 0x08, 0x02, 0x0b, 0x08, 0x66, 0x1a, 0x86, 0x1a, 0x02, 0x07, + 0x1a, 0x01, 0x33, 0x1a, 0x19, 0x00, 0x17, 0x60, 0x17, 0x02, 0x3d, 0x50, 0x17, 0x80, 0x17, 0x90, + 0x17, 0xf0, 0x17, 0x04, 0xe1, 0x17, 0xf1, 0x17, 0x02, 0xb2, 0x17, 0x01, 0x53, 0x17, 0x01, 0x14, + 0x17, 0x44, 0x17, 0x02, 0xb5, 0x17, 0x01, 0x76, 0x17, 0xa6, 0x17, 0x02, 0x07, 0x17, 0x17, 0x17, + 0x02, 0x0a, 0x17, 0x00, 0x0f, 0x30, 0x0f, 0x60, 0x0f, 0x03, 0x3d, 0x80, 0x0f, 0xb0, 0x0f, 0xe0, + 0x0f, 0x03, 0x11, 0x0f, 0x41, 0x0f, 0x02, 0xe1, 0x0f, 0x01, 0x72, 0x0f, 0xa2, 0x0f, 0x02, 0x04, + 0x0f, 0x44, 0x0f, 0x02, 0xd4, 0x40, 0x3e, 0x0f, 0x01, 0xa5, 0x0f, 0x01, 0x66, 0x0f, 0x01, 0x07, + 0x0f, 0x37, 0x0f, 0x02, 0x0b, 0x0f, 0x00, 0x0a, 0x30, 0x0a, 0x02, 0x3d, 0x90, 0x0a, 0xc0, 0x0a, + 0x02, 0x21, 0x0a, 0x01, 0xf1, 0x0a, 0x01, 0x82, 0x0a, 0x01, 0x54, 0x0a, 0x01, 0xe4, 0x0a, 0x01, + 0xb5, 0x0a, 0x01, 0x46, 0x0a, 0x01, 0x17, 0x0a, 0x01, 0x0a, 0x00, 0x04, 0x39, 0xe6, 0x03, 0x01, + 0x03, 0x06, 0x10, 0x19, 0x1f, 0xb8, 0xff, 0x80, 0x40, 0x09, 0x34, 0x45, 0x48, 0x1f, 0x22, 0x2c, + 0x35, 0x38, 0x35, 0xb8, 0xfe, 0x00, 0x40, 0x3b, 0x31, 0x3b, 0x48, 0x61, 0x35, 0x01, 0x40, 0x35, + 0x50, 0x35, 0x02, 0x21, 0x35, 0x31, 0x35, 0x02, 0x10, 0x35, 0x01, 0x01, 0x35, 0x01, 0xe1, 0x35, + 0xf1, 0x35, 0x02, 0xb2, 0x35, 0xc2, 0x35, 0xd2, 0x35, 0x03, 0x93, 0x35, 0xa3, 0x35, 0x02, 0x82, + 0x35, 0x01, 0x63, 0x35, 0x73, 0x35, 0x02, 0x54, 0x35, 0x01, 0x43, 0x35, 0x01, 0x00, 0x92, 0x35, + 0x01, 0x01, 0x35, 0xb8, 0xff, 0x80, 0x40, 0x12, 0x0e, 0x12, 0x48, 0x33, 0x35, 0x01, 0x02, 0x10, + 0x35, 0x20, 0x35, 0x02, 0x08, 0x35, 0x01, 0x03, 0x35, 0x22, 0xb8, 0xff, 0x00, 0x40, 0x16, 0x18, + 0x1d, 0x48, 0xb5, 0x22, 0xc5, 0x22, 0xd5, 0x22, 0x03, 0xa6, 0x22, 0x01, 0x22, 0x58, 0x33, 0x01, + 0x33, 0xdd, 0x2c, 0x01, 0x2c, 0xb8, 0x01, 0x40, 0x40, 0x0c, 0x20, 0x26, 0x48, 0x4b, 0x2c, 0x5b, + 0x2c, 0x02, 0x3c, 0x2c, 0x01, 0x2c, 0xb8, 0x01, 0x00, 0x40, 0x1c, 0x17, 0x1c, 0x48, 0xaa, 0x2c, + 0xba, 0x2c, 0xca, 0x2c, 0x03, 0x2c, 0x80, 0x10, 0x13, 0x48, 0x5a, 0x2c, 0x01, 0x49, 0x2c, 0x01, + 0x2c, 0x40, 0x0a, 0x0d, 0x48, 0x2c, 0x1f, 0xb8, 0x02, 0x00, 0xb7, 0x32, 0x45, 0x48, 0x1f, 0x31, + 0x31, 0x26, 0x34, 0xb8, 0x02, 0x00, 0xb3, 0x30, 0x3b, 0x48, 0x34, 0xb8, 0x01, 0xc0, 0xb3, 0x2c, + 0x2f, 0x48, 0x34, 0xb8, 0x01, 0x80, 0x40, 0x33, 0x23, 0x2b, 0x48, 0x7c, 0x34, 0x8c, 0x34, 0x02, + 0x6b, 0x34, 0x01, 0x5c, 0x34, 0x01, 0x4b, 0x34, 0x01, 0x34, 0x80, 0x10, 0x13, 0x48, 0x5a, 0x34, + 0x01, 0x34, 0x40, 0x0a, 0x0e, 0x48, 0x34, 0x1b, 0x23, 0x2b, 0x23, 0x3b, 0x23, 0x03, 0x23, 0xc0, + 0x14, 0x1a, 0x48, 0x23, 0x57, 0x29, 0x01, 0x29, 0x2b, 0x08, 0x2d, 0xb8, 0xfe, 0x80, 0xb3, 0x24, + 0x27, 0x48, 0x2d, 0xb8, 0xfe, 0xc0, 0xb3, 0x1e, 0x23, 0x48, 0x2d, 0xb8, 0xff, 0x00, 0xb3, 0x1a, + 0x1d, 0x48, 0x2d, 0xb8, 0xff, 0x40, 0xb3, 0x11, 0x19, 0x48, 0x2d, 0xb8, 0xff, 0x80, 0x40, 0x0d, + 0x0d, 0x10, 0x48, 0x07, 0x2d, 0x17, 0x2d, 0x27, 0x2d, 0x03, 0x0a, 0x2d, 0x1e, 0xb8, 0xfe, 0x00, + 0x40, 0xae, 0x32, 0x45, 0x48, 0x1e, 0x08, 0x24, 0x01, 0x0f, 0x24, 0x26, 0x02, 0x20, 0x19, 0x40, + 0x19, 0x50, 0x19, 0x60, 0x19, 0x80, 0x19, 0xa0, 0x19, 0x06, 0x17, 0x19, 0x01, 0x00, 0x19, 0x01, + 0x3b, 0xc0, 0x19, 0xe0, 0x19, 0x02, 0xb1, 0x19, 0x01, 0x60, 0x19, 0x80, 0x19, 0xa0, 0x19, 0x03, + 0x01, 0x19, 0x11, 0x19, 0x21, 0x19, 0x41, 0x19, 0x04, 0xe1, 0x19, 0x01, 0xa2, 0x19, 0xc2, 0x19, + 0x02, 0x83, 0x19, 0x01, 0x72, 0x19, 0x01, 0x63, 0x19, 0x01, 0x04, 0x19, 0x24, 0x19, 0x44, 0x19, + 0x03, 0xa5, 0x19, 0xc5, 0x19, 0xd5, 0x19, 0xe5, 0x19, 0x04, 0x66, 0x19, 0x86, 0x19, 0x02, 0x47, + 0x19, 0x01, 0x36, 0x19, 0x01, 0x07, 0x19, 0x01, 0x0b, 0x19, 0x20, 0x06, 0x01, 0x07, 0x06, 0x01, + 0x3c, 0xd6, 0x06, 0x01, 0x80, 0x06, 0x01, 0x77, 0x06, 0x01, 0xe1, 0x06, 0x01, 0x43, 0x06, 0x01, + 0xa5, 0x06, 0x01, 0x07, 0x06, 0x01, 0x0c, 0x06, 0x69, 0x17, 0x99, 0x17, 0x02, 0x08, 0x17, 0x01, + 0x33, 0x17, 0x1f, 0x10, 0x2f, 0x10, 0x3f, 0x10, 0x7f, 0x10, 0x04, 0x08, 0x10, 0x01, 0x3c, 0xaf, + 0x10, 0xef, 0x10, 0x02, 0x9e, 0x10, 0x01, 0x4f, 0x10, 0x8f, 0x10, 0x02, 0x0d, 0x10, 0x01, 0x10, + 0xb8, 0x01, 0x60, 0x40, 0xff, 0x2a, 0x49, 0x4c, 0x10, 0x5c, 0x10, 0x6c, 0x10, 0xac, 0x10, 0xec, + 0x10, 0x05, 0x0b, 0x10, 0x01, 0xcb, 0x10, 0x01, 0xaa, 0x10, 0xba, 0x10, 0x02, 0x19, 0x10, 0x29, + 0x10, 0x69, 0x10, 0x03, 0x08, 0x10, 0x01, 0x0b, 0x10, 0x0f, 0x03, 0x1f, 0x03, 0x02, 0x41, 0xd8, + 0x03, 0x01, 0x8f, 0x03, 0x9f, 0x03, 0x02, 0xfd, 0x03, 0x01, 0xee, 0x03, 0x01, 0x4c, 0x03, 0x5c, + 0x03, 0x02, 0xbb, 0x03, 0x01, 0xaa, 0x03, 0x01, 0x09, 0x03, 0x19, 0x03, 0x02, 0x0f, 0x03, 0x17, + 0x15, 0x01, 0x15, 0x15, 0x0a, 0x0f, 0x18, 0x2f, 0x18, 0x4f, 0x18, 0x5f, 0x18, 0x6f, 0x18, 0x8f, + 0x18, 0xaf, 0x18, 0x07, 0x3b, 0xbf, 0x18, 0xcf, 0x18, 0xef, 0x18, 0x03, 0xae, 0x18, 0x01, 0x4f, + 0x18, 0x6f, 0x18, 0x8f, 0x18, 0x03, 0x0e, 0x18, 0x1e, 0x18, 0x2e, 0x18, 0x03, 0x8d, 0x18, 0xad, + 0x18, 0xcd, 0x18, 0xed, 0x18, 0x04, 0x4c, 0x18, 0x6c, 0x18, 0x7c, 0x18, 0x03, 0x0b, 0x18, 0x2b, + 0x18, 0x02, 0xdb, 0x18, 0xeb, 0x18, 0x02, 0x8a, 0x18, 0xaa, 0x18, 0xca, 0x18, 0x03, 0x49, 0x18, + 0x69, 0x18, 0x02, 0x38, 0x18, 0x01, 0x29, 0x18, 0x01, 0x08, 0x18, 0x01, 0x0b, 0x18, 0x0f, 0x07, + 0x01, 0x3e, 0xd9, 0x07, 0x01, 0x8e, 0x07, 0x01, 0x78, 0x07, 0x01, 0xed, 0x07, 0x01, 0x4b, 0x07, + 0x01, 0xaa, 0x07, 0x01, 0x08, 0x07, 0x01, 0x0c, 0x07, 0x66, 0x0d, 0x01, 0x07, 0x0d, 0x01, 0x33, + 0x0d, 0x0f, 0x08, 0x00, 0x11, 0x10, 0x11, 0x20, 0x11, 0x60, 0x11, 0x04, 0x3d, 0x80, 0x11, 0x90, + 0x11, 0xa0, 0x11, 0xe0, 0x11, 0x04, 0x01, 0x11, 0x41, 0x11, 0x02, 0xe1, 0x11, 0xf1, 0x11, 0x02, + 0xa2, 0x11, 0x01, 0x53, 0x11, 0x63, 0x11, 0x02, 0x04, 0x11, 0x44, 0x11, 0x02, 0x65, 0x11, 0xa5, + 0x11, 0xb5, 0x11, 0xc5, 0x40, 0x39, 0x11, 0x04, 0x07, 0x11, 0x17, 0x11, 0x27, 0x11, 0x03, 0x0b, + 0x11, 0x00, 0x02, 0x10, 0x02, 0x02, 0x41, 0xe0, 0x02, 0xf0, 0x02, 0x02, 0xa7, 0x02, 0x01, 0x50, + 0x02, 0x01, 0x41, 0x02, 0x01, 0xb2, 0x02, 0x01, 0xa3, 0x02, 0x01, 0x00, 0x00, 0x02, 0x10, 0x02, + 0x02, 0x01, 0x60, 0x02, 0x70, 0x02, 0x02, 0x02, 0x02, 0xaf, 0x08, 0x01, 0x08, 0x0a, 0x02, 0x00, + 0x3f, 0xcd, 0x72, 0x32, 0x5f, 0x5d, 0x5f, 0x71, 0x5f, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, + 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x3f, 0xcd, 0x5e, + 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x12, 0x39, + 0x2f, 0x5d, 0x33, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x33, 0x5e, + 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x2b, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0xcd, 0x5e, + 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x32, 0x5e, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, + 0x5d, 0x5d, 0x5d, 0x3f, 0xcd, 0x5e, 0x5d, 0x32, 0x2b, 0x32, 0x5e, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x3f, 0xcd, 0x5d, 0x32, 0x2b, 0x71, 0x32, 0x2b, 0x5d, 0x2b, 0x71, 0x71, 0x71, 0x71, 0x2b, + 0x2b, 0x2b, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x33, 0x2b, 0x5d, 0x5d, 0x2b, 0x5d, 0x2b, 0x71, 0x71, + 0x2b, 0x71, 0xcd, 0x5d, 0x32, 0x5d, 0x5d, 0x2b, 0x32, 0x5f, 0x5d, 0x5d, 0x5f, 0x5d, 0x2b, 0x5f, + 0x5d, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x2b, 0x01, + 0x10, 0xdc, 0x32, 0xdc, 0x32, 0x2b, 0xde, 0x32, 0xdc, 0x32, 0x72, 0xcc, 0xcd, 0x32, 0x32, 0x5d, + 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, + 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, + 0x72, 0x5e, 0x5d, 0x10, 0xcd, 0x5e, 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, + 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, + 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, + 0x5e, 0x5d, 0x5d, 0x10, 0xcd, 0x5f, 0x5e, 0x5d, 0x32, 0x32, 0x5d, 0x2b, 0x2b, 0x2b, 0x32, 0x5d, + 0x2b, 0x5f, 0x71, 0x72, 0x72, 0x72, 0x2b, 0x32, 0x5d, 0x2b, 0x10, 0xcd, 0x5d, 0x2b, 0x32, 0x5d, + 0x2b, 0x5d, 0x5d, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x2b, 0x32, 0x2b, 0x2b, 0x5d, 0x5d, 0x2b, + 0x72, 0x72, 0x72, 0x72, 0x32, 0x2b, 0x32, 0x5d, 0x2b, 0x5d, 0x5d, 0x31, 0x30, 0x00, 0x5e, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x2b, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x01, 0x5e, 0x5d, 0x5d, + 0x5e, 0x5d, 0x5d, 0x5e, 0x5d, 0x5d, 0x5e, 0x5d, 0x5e, 0x5d, 0x5e, 0x5d, 0x5e, 0x5d, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x11, 0x33, 0x11, 0x03, + 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, + 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, + 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, + 0x11, 0x33, 0x11, 0x02, 0x7c, 0x1d, 0x1d, 0x1d, 0xfe, 0xaf, 0x01, 0x34, 0xfe, 0xcc, 0x01, 0x34, + 0xfe, 0xaf, 0x1d, 0x01, 0x34, 0xfe, 0xaf, 0x1d, 0x9b, 0x1c, 0x1c, 0x1c, 0xfe, 0xaf, 0x01, 0x35, + 0xfe, 0xcb, 0x01, 0x35, 0xfe, 0xae, 0x1d, 0x01, 0x35, 0xfe, 0xae, 0x1d, 0x01, 0x6b, 0x01, 0x2a, + 0xfe, 0xd6, 0xfe, 0xb4, 0x01, 0x2a, 0xfe, 0xd6, 0x02, 0x79, 0x1c, 0x1c, 0xfd, 0x68, 0x1d, 0x1d, + 0x01, 0x6b, 0x01, 0x2a, 0xfe, 0xd6, 0x1f, 0x1d, 0x1d, 0xfe, 0xd3, 0x01, 0x2a, 0xfe, 0xd6, 0x01, + 0x4c, 0x01, 0x2a, 0xfe, 0xd6, 0xfe, 0xb4, 0x01, 0x2a, 0xfe, 0xd6, 0x02, 0x79, 0x1c, 0x1c, 0xfd, + 0x68, 0x1d, 0x1d, 0x01, 0x6b, 0x01, 0x2a, 0xfe, 0xd6, 0x1f, 0x1d, 0x1d, 0xfe, 0xd3, 0x01, 0x2a, + 0xfe, 0xd6, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0xff, 0xf3, 0x01, 0xf0, 0x01, 0xde, 0x00, 0x03, + 0x00, 0x1d, 0x00, 0x29, 0x00, 0xe7, 0x40, 0x1b, 0x28, 0x20, 0x10, 0x00, 0x4d, 0x28, 0x40, 0x0f, + 0x00, 0x4d, 0x27, 0x40, 0x10, 0x00, 0x4d, 0x1b, 0x20, 0x0f, 0x10, 0x00, 0x4c, 0x1a, 0x20, 0x10, + 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xe0, 0x40, 0x0e, + 0x13, 0x00, 0x4d, 0x07, 0x40, 0x0a, 0x00, 0x4d, 0x06, 0x40, 0x0a, 0x00, 0x4d, 0x05, 0xb8, 0xff, + 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xe0, 0xb3, 0x13, 0x00, 0x4d, 0x1d, 0xb8, 0xff, + 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xd8, 0xb3, 0x12, 0x00, 0x4d, 0x14, 0xb8, 0xff, + 0xc0, 0xb3, 0x11, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xf0, 0xb3, 0x10, 0x00, 0x4d, 0x14, 0xb8, 0xff, + 0xd8, 0xb3, 0x0a, 0x00, 0x4d, 0x04, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x04, 0xb8, 0xff, + 0xc0, 0x40, 0x31, 0x0b, 0x0c, 0x00, 0x4c, 0x12, 0x11, 0x1c, 0x04, 0x27, 0x21, 0x11, 0x27, 0x21, + 0x17, 0x09, 0x09, 0x17, 0x21, 0x27, 0x11, 0x05, 0x00, 0x02, 0x2b, 0x00, 0x2a, 0x0e, 0x14, 0x01, + 0x44, 0x24, 0x01, 0x20, 0x24, 0x30, 0x24, 0x02, 0x1d, 0x24, 0x1e, 0x04, 0x1e, 0x04, 0x1e, 0x01, + 0x03, 0x07, 0x01, 0x0b, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x5d, + 0x5d, 0x12, 0x39, 0x39, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x37, 0x17, + 0x07, 0x37, 0x34, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x17, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x15, 0x17, 0x17, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0x04, 0xf6, 0xf6, 0xf6, 0x14, 0x18, 0x1c, 0x17, 0x09, 0x15, 0x23, 0x19, + 0x15, 0x2c, 0x12, 0x11, 0x1d, 0x1d, 0x12, 0x15, 0x17, 0x1b, 0x16, 0x01, 0x1f, 0x0e, 0x15, 0x15, + 0x0e, 0x10, 0x16, 0x16, 0xe8, 0xf6, 0xf6, 0xf5, 0xb1, 0x16, 0x21, 0x1d, 0x20, 0x16, 0x0c, 0x1b, + 0x15, 0x0e, 0x0b, 0x0c, 0x2e, 0x11, 0x0d, 0x0f, 0x10, 0x18, 0x1b, 0x20, 0x17, 0x0a, 0x69, 0x14, + 0x11, 0x11, 0x15, 0x15, 0x11, 0x11, 0x14, 0x00, 0xff, 0xff, 0xff, 0xd0, 0xff, 0xf5, 0x02, 0x20, + 0x02, 0x79, 0x00, 0x27, 0x01, 0x6f, 0xff, 0x6a, 0x00, 0x00, 0x00, 0x26, 0x00, 0x11, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x74, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x22, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, 0x04, 0x45, 0x01, 0x00, + 0x06, 0x04, 0x49, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, + 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0xd2, 0x50, 0xfe, 0xde, 0x01, 0x72, 0x01, 0xcc, 0xfd, + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x17, 0x40, 0x0a, 0x05, 0x45, 0x02, 0x04, 0x07, 0x05, 0x49, 0x02, 0x01, 0x86, 0x00, 0x3f, + 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, 0x30, 0x13, 0x33, 0x11, 0x33, 0x15, 0x21, 0xd2, + 0x50, 0xd2, 0xfe, 0xde, 0x03, 0x3e, 0xfe, 0x34, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, + 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, 0x00, 0x45, 0x03, 0x02, + 0x07, 0x01, 0x49, 0x03, 0x04, 0x92, 0x00, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, + 0x30, 0x13, 0x21, 0x15, 0x23, 0x11, 0x23, 0xd2, 0x01, 0x22, 0xd2, 0x50, 0x01, 0x72, 0x50, 0xfe, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, 0xff, 0x56, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x03, + 0x00, 0x12, 0xb7, 0x03, 0x45, 0x02, 0x04, 0x03, 0x86, 0x00, 0x92, 0x00, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x05, 0x23, 0x11, 0x33, 0x01, 0x22, 0x50, 0x50, 0xaa, 0x03, 0xe8, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x22, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x03, 0x00, 0x11, 0xb6, 0x02, + 0x01, 0x04, 0x03, 0x49, 0x02, 0xa2, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x11, + 0x35, 0x21, 0x15, 0x01, 0xf4, 0x01, 0x22, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x1c, 0x40, 0x0d, 0x05, 0x00, 0x45, 0x02, + 0x03, 0x08, 0x02, 0x49, 0x05, 0x07, 0x86, 0x00, 0x92, 0x00, 0x3f, 0x3f, 0xd5, 0xed, 0x01, 0x10, + 0xd0, 0xd5, 0xed, 0x33, 0x31, 0x30, 0x05, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x01, 0x22, + 0x50, 0xd2, 0xd2, 0x50, 0xaa, 0x01, 0xcc, 0x50, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x07, 0x00, 0x32, 0x40, 0x1f, 0x10, 0x01, 0x40, 0x01, + 0x50, 0x01, 0x03, 0x20, 0x01, 0x60, 0x01, 0x70, 0x01, 0x03, 0x01, 0x09, 0x02, 0x45, 0x05, 0x06, + 0x08, 0x02, 0x90, 0x05, 0x01, 0x05, 0x49, 0x07, 0x9c, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0xed, 0x5d, + 0x32, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xc0, 0x5d, 0x71, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, + 0x23, 0x11, 0x23, 0x35, 0x01, 0xf4, 0xd2, 0x50, 0xd2, 0x01, 0x72, 0x50, 0xfe, 0x34, 0x01, 0xcc, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, + 0x00, 0x31, 0x40, 0x1e, 0x00, 0x07, 0x40, 0x07, 0x02, 0x60, 0x07, 0xc0, 0x07, 0x02, 0x07, 0x09, + 0x7f, 0x05, 0x8f, 0x05, 0x9f, 0x05, 0x03, 0x05, 0x45, 0x02, 0x01, 0x08, 0x07, 0x49, 0x02, 0x05, + 0x04, 0x86, 0x00, 0x3f, 0xd5, 0x32, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x5d, 0x10, 0xc0, 0x5d, + 0x71, 0x31, 0x30, 0x11, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0xd2, 0x50, 0xd2, 0x01, 0x22, + 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, 0xff, 0x56, 0x01, 0xf4, + 0x03, 0x3e, 0x00, 0x07, 0x00, 0x28, 0x40, 0x16, 0x05, 0x90, 0x03, 0x01, 0x03, 0x9f, 0x02, 0x01, + 0x02, 0x45, 0x00, 0x08, 0x06, 0x92, 0x90, 0x05, 0x01, 0x05, 0x49, 0x02, 0x01, 0x86, 0x00, 0x3f, + 0xdd, 0xed, 0x5d, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0x5d, 0xcd, 0x5d, 0x33, 0x31, 0x30, 0x13, 0x33, + 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0xd2, 0x50, 0xd2, 0xd2, 0x50, 0x03, 0x3e, 0xfe, 0x34, 0x50, + 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x0b, + 0x00, 0x40, 0x40, 0x28, 0x00, 0x08, 0x10, 0x08, 0x40, 0x08, 0x03, 0x20, 0x08, 0x30, 0x08, 0x70, + 0x08, 0xc0, 0x08, 0x04, 0x08, 0x0d, 0x06, 0x09, 0x45, 0x03, 0x30, 0x00, 0x01, 0x00, 0x01, 0x0c, + 0x0a, 0x92, 0x00, 0x90, 0x09, 0x01, 0x09, 0x49, 0x03, 0x06, 0x05, 0x86, 0x00, 0x3f, 0xd5, 0x32, + 0xed, 0x5d, 0x32, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0x32, 0xed, 0x32, 0x10, 0xc0, 0x5d, 0x71, + 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0xd2, 0xd2, + 0xd2, 0x50, 0xd2, 0xd2, 0x50, 0x01, 0x22, 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x56, + 0x40, 0x37, 0x00, 0x09, 0x01, 0x20, 0x09, 0x60, 0x09, 0x70, 0x09, 0xc0, 0x09, 0x04, 0x09, 0x00, + 0x07, 0x01, 0x20, 0x07, 0x60, 0x07, 0x70, 0x07, 0xc0, 0x07, 0x04, 0x07, 0x11, 0x0a, 0x45, 0x0d, + 0x0e, 0x10, 0x05, 0x45, 0x02, 0x01, 0x10, 0x0b, 0x92, 0x0d, 0x0a, 0x49, 0xbf, 0x08, 0x01, 0x08, + 0x07, 0x49, 0x02, 0x80, 0x05, 0x01, 0x05, 0x04, 0x86, 0x00, 0x3f, 0xd5, 0x5d, 0x32, 0xfd, 0xde, + 0x5d, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xc0, 0x5d, + 0x71, 0xc0, 0x5d, 0x71, 0x31, 0x30, 0x11, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1d, 0x02, 0x23, + 0x11, 0x23, 0x11, 0x23, 0x35, 0xd2, 0x50, 0xd2, 0xd2, 0x50, 0xd2, 0x01, 0x72, 0x50, 0x01, 0x7c, + 0xfe, 0x84, 0x50, 0x50, 0x50, 0xfe, 0x84, 0x01, 0x7c, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x4a, 0x40, 0x2e, 0x80, 0x0f, + 0x90, 0x0f, 0x02, 0x0f, 0x45, 0x0a, 0x3f, 0x0d, 0xbf, 0x0d, 0x02, 0x0d, 0x0c, 0x11, 0x05, 0x8f, + 0x00, 0x9f, 0x00, 0x02, 0x00, 0x45, 0x30, 0x02, 0xb0, 0x02, 0x02, 0x02, 0x03, 0x10, 0x0f, 0x92, + 0x0d, 0x49, 0x0a, 0x08, 0x86, 0x02, 0x49, 0x05, 0x07, 0x86, 0x01, 0x92, 0x00, 0x3f, 0x3f, 0xd5, + 0xed, 0x3f, 0xd5, 0xed, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x33, 0x10, 0xd0, 0xd5, + 0x5d, 0x32, 0xed, 0x5d, 0x31, 0x30, 0x17, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x3b, 0x02, 0x11, + 0x33, 0x15, 0x23, 0x11, 0x23, 0xd2, 0x50, 0x82, 0x82, 0x50, 0x50, 0x50, 0x82, 0x82, 0x50, 0xaa, + 0x01, 0xcc, 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0x22, 0x01, 0x72, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, 0x02, 0x45, 0x04, 0x05, + 0x06, 0x01, 0x49, 0x04, 0x03, 0x92, 0x00, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, + 0x30, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0x22, 0x50, 0xd2, 0x01, 0x72, 0xfd, 0xe4, 0x01, + 0xcc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x5c, 0x40, 0x3e, 0x5f, 0x08, 0x6f, 0x08, 0x02, 0x08, 0x45, 0x0a, 0x0b, 0x0c, + 0x5f, 0x03, 0x6f, 0x03, 0x02, 0x03, 0x45, 0x01, 0x00, 0x0c, 0x07, 0x40, 0x1f, 0x00, 0x4d, 0x5f, + 0x07, 0x01, 0x07, 0x49, 0x5f, 0x0a, 0x7f, 0x0a, 0x8f, 0x0a, 0x03, 0x30, 0x0a, 0x01, 0x0a, 0x08, + 0x92, 0x50, 0x04, 0x60, 0x04, 0x02, 0x04, 0x49, 0xbf, 0x01, 0x01, 0x80, 0x01, 0x01, 0x1f, 0x01, + 0x01, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0x5d, 0x5d, 0x5d, 0xed, 0x71, 0x3f, 0xd5, 0x5d, 0x5d, + 0xed, 0x71, 0x2b, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x71, 0x10, 0xd0, 0xd5, 0xed, 0x71, 0x31, 0x30, + 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0xd2, 0x50, 0xfe, 0xde, + 0x01, 0x22, 0x50, 0xd2, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x01, 0x7c, 0x00, + 0x00, 0x02, 0x00, 0xd2, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x38, + 0x40, 0x20, 0xd0, 0x06, 0x01, 0x06, 0x07, 0x45, 0x0a, 0x0c, 0xd0, 0x05, 0x01, 0x05, 0x04, 0x45, + 0x01, 0x0c, 0x0b, 0x49, 0xb0, 0x07, 0x01, 0x8f, 0x07, 0x01, 0x07, 0x08, 0x92, 0x00, 0x49, 0x04, + 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xed, 0x3f, 0xd5, 0x5d, 0x5d, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, + 0x5d, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0x31, 0x30, 0x01, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, + 0x11, 0x23, 0x11, 0x21, 0x01, 0xf4, 0xfe, 0xde, 0x50, 0xd2, 0xd2, 0x50, 0x01, 0x22, 0x01, 0x72, + 0x01, 0xcc, 0xfe, 0x84, 0xf0, 0xfe, 0x84, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x40, 0x40, 0x29, 0x00, 0x09, + 0x10, 0x09, 0x40, 0x09, 0x50, 0x09, 0x04, 0x20, 0x09, 0x60, 0x09, 0x70, 0x09, 0xc0, 0x09, 0x04, + 0x09, 0x0b, 0x0c, 0x30, 0x06, 0xd0, 0x06, 0x02, 0x06, 0x05, 0x45, 0x02, 0x01, 0x0c, 0x09, 0x49, + 0x08, 0x07, 0x49, 0x02, 0x05, 0x04, 0x86, 0x00, 0x3f, 0xd5, 0x32, 0xfd, 0xd6, 0xed, 0x01, 0x10, + 0xd0, 0xd5, 0xfd, 0xc5, 0x5d, 0x10, 0xd0, 0xc5, 0x5d, 0x71, 0x31, 0x30, 0x11, 0x35, 0x33, 0x11, + 0x33, 0x11, 0x33, 0x1d, 0x02, 0x21, 0x35, 0xd2, 0x50, 0xd2, 0xfe, 0x0c, 0x01, 0x72, 0x50, 0x01, + 0x7c, 0xfe, 0x84, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x22, + 0x03, 0x3e, 0x00, 0x05, 0x00, 0x09, 0x00, 0x3c, 0x40, 0x25, 0x07, 0x40, 0x0c, 0x00, 0x4d, 0x7f, + 0x07, 0xbf, 0x07, 0x02, 0x10, 0x07, 0x50, 0x07, 0x02, 0xdf, 0x07, 0x01, 0x70, 0x07, 0x01, 0x07, + 0x09, 0x0a, 0x04, 0x45, 0x01, 0x00, 0x0a, 0x08, 0x49, 0x07, 0x04, 0x49, 0x01, 0x03, 0x86, 0x00, + 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xc5, 0x5d, 0x5d, 0x71, + 0x71, 0x2b, 0x31, 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0xd2, 0x50, + 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xde, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0x50, 0x00, 0x00, + 0x00, 0x02, 0x00, 0xd2, 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x09, 0x00, 0x38, + 0x40, 0x21, 0x10, 0x08, 0x01, 0x70, 0x08, 0x01, 0x08, 0x06, 0x0a, 0x70, 0x05, 0x01, 0x5f, 0x05, + 0x01, 0x30, 0x05, 0xd0, 0x05, 0x02, 0x05, 0x04, 0x45, 0x01, 0x0a, 0x09, 0x49, 0x06, 0x01, 0x49, + 0x04, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0x71, + 0x71, 0x10, 0xd6, 0xc5, 0x5d, 0x71, 0x31, 0x30, 0x01, 0x21, 0x11, 0x33, 0x11, 0x33, 0x05, 0x21, + 0x15, 0x21, 0x01, 0xf4, 0xfe, 0xde, 0x50, 0xd2, 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xde, 0x01, 0x72, + 0x01, 0xcc, 0xfe, 0x84, 0xa0, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x40, 0x40, 0x29, 0x00, 0x0a, 0x10, 0x0a, 0x40, 0x0a, + 0x50, 0x0a, 0x04, 0x20, 0x0a, 0x60, 0x0a, 0x70, 0x0a, 0xc0, 0x0a, 0x04, 0x0a, 0x08, 0x0c, 0x30, + 0x01, 0xd0, 0x01, 0x02, 0x01, 0x02, 0x45, 0x05, 0x06, 0x0c, 0x0a, 0x49, 0x0b, 0x00, 0x49, 0x05, + 0x02, 0x03, 0x92, 0x00, 0x3f, 0xd5, 0xc0, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xfd, 0xc5, + 0x5d, 0x10, 0xd0, 0xc5, 0x5d, 0x71, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3d, + 0x02, 0x21, 0x15, 0x01, 0xf4, 0xd2, 0x50, 0xd2, 0x01, 0xf4, 0x01, 0x22, 0x50, 0xfe, 0x84, 0x01, + 0x7c, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x22, + 0x01, 0xc2, 0x00, 0x05, 0x00, 0x09, 0x00, 0x34, 0x40, 0x1e, 0x10, 0x07, 0x50, 0x07, 0x02, 0xdf, + 0x07, 0x01, 0x70, 0x07, 0x01, 0x3f, 0x07, 0x01, 0x07, 0x09, 0x0a, 0x02, 0x45, 0x04, 0x05, 0x0a, + 0x07, 0x49, 0x08, 0x01, 0x49, 0x04, 0x03, 0x92, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x01, 0x10, + 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xc5, 0x5d, 0x5d, 0x5d, 0x71, 0x31, 0x30, 0x11, 0x21, 0x11, 0x23, + 0x11, 0x23, 0x35, 0x21, 0x15, 0x21, 0x01, 0x22, 0x50, 0xd2, 0x01, 0x22, 0xfe, 0xde, 0x01, 0x22, + 0xfe, 0x34, 0x01, 0x7c, 0xf0, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd2, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x05, 0x00, 0x09, 0x00, 0x38, 0x40, 0x22, 0x10, 0x07, 0x50, 0x07, 0x02, 0x70, + 0x07, 0x01, 0x07, 0x09, 0x0a, 0x70, 0x00, 0xb0, 0x00, 0x02, 0x30, 0x00, 0xd0, 0x00, 0x02, 0x00, + 0x01, 0x45, 0x04, 0x0a, 0x07, 0x49, 0x08, 0x05, 0x49, 0x01, 0x02, 0x92, 0x00, 0x3f, 0xd5, 0xfd, + 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0x71, 0x10, 0xd6, 0xc5, 0x5d, 0x71, 0x31, 0x30, + 0x25, 0x23, 0x11, 0x23, 0x11, 0x21, 0x25, 0x21, 0x15, 0x21, 0x01, 0xf4, 0xd2, 0x50, 0x01, 0x22, + 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xde, 0xd2, 0xfe, 0x84, 0x01, 0xcc, 0xa0, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0x72, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1e, + 0x40, 0x0f, 0x05, 0x45, 0x04, 0x03, 0x45, 0x02, 0x08, 0x06, 0x92, 0x04, 0x86, 0x03, 0x86, 0x00, + 0x92, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x17, 0x23, + 0x11, 0x3b, 0x02, 0x11, 0x23, 0xd2, 0x50, 0x50, 0x50, 0x50, 0x50, 0xaa, 0x03, 0xe8, 0xfc, 0x18, + 0x00, 0x04, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, + 0x00, 0x17, 0x00, 0x76, 0x40, 0x4e, 0x30, 0x06, 0xb0, 0x06, 0x02, 0x06, 0x07, 0x45, 0x70, 0x0a, + 0xa0, 0x0a, 0xb0, 0x0a, 0x03, 0xc0, 0x0a, 0xd0, 0x0a, 0x02, 0x0a, 0x13, 0x45, 0xb0, 0x16, 0x01, + 0x16, 0x12, 0x18, 0x30, 0x11, 0xb0, 0x11, 0x02, 0x11, 0x10, 0x45, 0x70, 0x0d, 0xa0, 0x0d, 0xb0, + 0x0d, 0x03, 0xc0, 0x0d, 0xd0, 0x0d, 0x02, 0x0d, 0x04, 0x45, 0xb0, 0x01, 0x01, 0x01, 0x00, 0x18, + 0x15, 0x92, 0x07, 0x49, 0x0a, 0x0d, 0x49, 0x10, 0x0e, 0x86, 0x09, 0x92, 0x16, 0x49, 0x13, 0x04, + 0x49, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x3f, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, + 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xfd, 0xd6, 0x5d, 0x71, 0xfd, 0xc5, 0x5d, 0x10, 0xd0, 0xd5, + 0x5d, 0xfd, 0xd6, 0x5d, 0x71, 0xfd, 0xc5, 0x5d, 0x31, 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, + 0x05, 0x23, 0x11, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x05, 0x33, 0x11, 0x23, + 0x11, 0x23, 0x82, 0x50, 0xd2, 0x01, 0xf4, 0x82, 0x50, 0xd2, 0xd2, 0x50, 0x82, 0xfe, 0x0c, 0xd2, + 0x50, 0x82, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0xa0, 0xfe, 0x84, 0x01, 0xcc, 0x50, 0x01, 0xcc, + 0xfe, 0x84, 0xa0, 0xfe, 0x34, 0x01, 0x7c, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, + 0x03, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x45, 0x40, 0x29, 0x9f, 0x0b, 0x01, 0x0b, + 0x45, 0x0e, 0x0f, 0x10, 0x01, 0x40, 0x12, 0x00, 0x4d, 0x8f, 0x01, 0x01, 0x01, 0x45, 0x00, 0x9f, + 0x07, 0x01, 0x07, 0x45, 0x05, 0x04, 0x10, 0x0d, 0x92, 0x0e, 0x49, 0x0b, 0x08, 0x49, 0x05, 0x07, + 0x86, 0x02, 0x92, 0x00, 0x86, 0x00, 0x3f, 0x3f, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x3f, 0x01, 0x10, + 0xd0, 0xd5, 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x2b, 0x10, 0xd0, 0xd5, 0xed, 0x5d, 0x31, 0x30, 0x01, + 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x33, 0x11, 0x23, 0x15, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, + 0x22, 0x50, 0x50, 0xfe, 0xde, 0x82, 0x50, 0xd2, 0xd2, 0x50, 0x82, 0x03, 0x3e, 0xfc, 0x18, 0x02, + 0x6c, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x01, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x82, + 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x40, + 0x90, 0x0d, 0x01, 0x0d, 0x45, 0x0b, 0x20, 0x0a, 0x01, 0x0a, 0x11, 0x90, 0x05, 0x01, 0x05, 0x45, + 0x08, 0x20, 0x09, 0x01, 0x09, 0x11, 0x00, 0x40, 0x12, 0x00, 0x4d, 0x8f, 0x00, 0x01, 0x00, 0x45, + 0x01, 0x40, 0x0f, 0x00, 0x4d, 0xb0, 0x01, 0x01, 0x7f, 0x01, 0x8f, 0x01, 0x02, 0x30, 0x01, 0x01, + 0x01, 0x10, 0x0c, 0x92, 0x0a, 0x49, 0x0f, 0x04, 0x49, 0x09, 0x06, 0x86, 0x03, 0x86, 0x01, 0x92, + 0x00, 0x3f, 0x3f, 0x3f, 0xd4, 0xfd, 0xd6, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0x5d, 0x2b, + 0xed, 0x5d, 0x2b, 0x10, 0xd0, 0x5d, 0xd5, 0xed, 0x5d, 0x10, 0xd0, 0x5d, 0xd5, 0xed, 0x5d, 0x31, + 0x30, 0x17, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, + 0x33, 0xd2, 0x50, 0x50, 0x01, 0x22, 0xd2, 0x50, 0x82, 0x82, 0x50, 0xd2, 0xaa, 0x03, 0xe8, 0xfe, + 0x34, 0x01, 0xcc, 0xfe, 0x84, 0xf0, 0xfe, 0x84, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x3f, 0x40, 0x24, + 0x0b, 0x45, 0x3f, 0x0e, 0xbf, 0x0e, 0x02, 0x0e, 0x0f, 0x11, 0x08, 0x45, 0x30, 0x05, 0xb0, 0x05, + 0x02, 0x05, 0x04, 0x10, 0x00, 0x03, 0x10, 0x0a, 0x49, 0x0e, 0x0c, 0x86, 0x02, 0x49, 0x03, 0x08, + 0x49, 0x05, 0x07, 0x86, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, + 0xc5, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x15, 0x21, + 0x35, 0x35, 0x33, 0x11, 0x33, 0x11, 0x23, 0x21, 0x23, 0x11, 0x33, 0x11, 0x33, 0x01, 0xf4, 0xfe, + 0x0c, 0x82, 0x50, 0xd2, 0x01, 0xf4, 0xd2, 0x50, 0x82, 0x01, 0x22, 0x50, 0x50, 0xa0, 0x01, 0x7c, + 0xfe, 0x34, 0x01, 0xcc, 0xfe, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x72, + 0x03, 0x3e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x3a, 0x40, 0x22, 0x0a, 0x45, 0xa0, 0x07, 0x01, 0x3f, + 0x07, 0x01, 0x07, 0x0b, 0x0c, 0x04, 0x45, 0x01, 0x05, 0x0c, 0x0a, 0x49, 0x07, 0x09, 0x86, 0x04, + 0x49, 0x50, 0x01, 0x01, 0x1f, 0x01, 0x3f, 0x01, 0x02, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0x5d, + 0x5d, 0xed, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xd5, 0x5d, 0x5d, 0xed, + 0x31, 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, 0x82, 0x50, + 0xd2, 0x01, 0x22, 0x50, 0xfe, 0x8e, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0x02, 0x1c, 0xfd, + 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x40, 0x40, 0x27, 0x3f, 0x0b, 0x01, 0x0b, 0x0a, 0x45, 0x30, 0x07, 0xb0, 0x07, + 0x02, 0x07, 0x0c, 0x05, 0x04, 0x45, 0xb0, 0x01, 0x01, 0x01, 0x0c, 0x07, 0x49, 0x0a, 0x09, 0x86, + 0x01, 0x49, 0x50, 0x04, 0x01, 0x1f, 0x04, 0x3f, 0x04, 0x02, 0x04, 0x02, 0x86, 0x00, 0x3f, 0xd5, + 0x5d, 0x5d, 0xed, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd4, 0x5d, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xfd, + 0xc5, 0x5d, 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, + 0x01, 0xf4, 0xd2, 0x50, 0x82, 0xfe, 0x8e, 0x50, 0x01, 0x22, 0x01, 0x72, 0x01, 0xcc, 0xfe, 0x84, + 0xf0, 0x02, 0x6c, 0xfd, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x41, 0x80, 0x08, 0x90, 0x08, + 0x02, 0x08, 0x45, 0x3f, 0x05, 0xbf, 0x05, 0x02, 0x05, 0x09, 0x11, 0x8f, 0x0b, 0x9f, 0x0b, 0x02, + 0x0b, 0x45, 0x30, 0x0e, 0xb0, 0x0e, 0x02, 0x0e, 0x0f, 0x10, 0x02, 0x00, 0x10, 0x02, 0x40, 0x12, + 0x00, 0x4d, 0x8f, 0x02, 0x01, 0x02, 0x49, 0xa0, 0x03, 0xb0, 0x03, 0x02, 0x03, 0x0a, 0x49, 0xb0, + 0x0e, 0x01, 0x0e, 0x0d, 0x92, 0x09, 0x49, 0xb0, 0x05, 0x01, 0x05, 0x07, 0x92, 0x00, 0x3f, 0xd5, + 0x5d, 0xed, 0x3f, 0xd5, 0x5d, 0xfd, 0xd6, 0x5d, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd0, 0xc5, 0x10, + 0xd0, 0xdd, 0x5d, 0xed, 0x5d, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x11, 0x35, 0x21, + 0x15, 0x15, 0x23, 0x11, 0x23, 0x11, 0x33, 0x21, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0xf4, 0x82, + 0x50, 0xd2, 0xfe, 0x0c, 0xd2, 0x50, 0x82, 0x01, 0x72, 0x50, 0x50, 0xa0, 0xfe, 0x84, 0x01, 0xcc, + 0xfe, 0x34, 0x01, 0x7c, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, 0x01, 0xc2, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x72, 0x40, 0x0d, 0x07, 0x40, 0x10, 0x00, 0x4d, 0x8f, 0x07, 0x9f, 0x07, 0x02, + 0x07, 0x45, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x23, 0x10, 0x00, 0x4d, 0x80, 0x0a, 0x01, 0x0a, 0x0b, + 0x0c, 0x01, 0x45, 0x9f, 0x04, 0xaf, 0x04, 0x02, 0x30, 0x04, 0x01, 0x04, 0x05, 0x0c, 0x07, 0x40, + 0x10, 0x00, 0x4d, 0x8f, 0x07, 0x9f, 0x07, 0x02, 0x07, 0x49, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x18, + 0x10, 0x00, 0x4d, 0x80, 0x0a, 0x90, 0x0a, 0x02, 0x0a, 0x08, 0x92, 0x01, 0x49, 0x5f, 0x04, 0x01, + 0x10, 0x04, 0x30, 0x04, 0x02, 0x04, 0x02, 0x92, 0x00, 0x3f, 0xd5, 0x5d, 0x5d, 0xed, 0x3f, 0xd5, + 0x5d, 0x2b, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0x5d, 0xed, 0x10, 0xd0, 0xd5, 0x5d, + 0x2b, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x11, 0x23, + 0x11, 0x21, 0xd2, 0x50, 0x82, 0x01, 0x72, 0x50, 0xfe, 0xde, 0x01, 0x22, 0xfe, 0x34, 0x01, 0x7c, + 0xf0, 0xfd, 0x94, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x64, 0x40, 0x46, 0x70, 0x06, 0x80, 0x06, 0x02, 0x06, + 0x7f, 0x07, 0x8f, 0x07, 0x9f, 0x07, 0x03, 0x07, 0x45, 0xb0, 0x0a, 0x01, 0x0a, 0x0c, 0x9f, 0x00, + 0xaf, 0x00, 0x02, 0x30, 0x00, 0x01, 0x00, 0x01, 0x45, 0xa0, 0x04, 0xb0, 0x04, 0x02, 0x3f, 0x04, + 0x01, 0x04, 0x0c, 0x7f, 0x0a, 0x8f, 0x0a, 0x9f, 0x0a, 0x03, 0x0a, 0x49, 0x70, 0x07, 0x80, 0x07, + 0x90, 0x07, 0x03, 0x07, 0x08, 0x92, 0x04, 0x49, 0x10, 0x01, 0x30, 0x01, 0x02, 0x01, 0x03, 0x92, + 0x00, 0x3f, 0xd5, 0x5d, 0xed, 0x3f, 0xd5, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xd4, 0x5d, 0x5d, 0xfd, + 0xc5, 0x5d, 0x5d, 0x10, 0xd6, 0x5d, 0xfd, 0x5d, 0xc5, 0x5d, 0x31, 0x30, 0x25, 0x23, 0x11, 0x23, + 0x11, 0x33, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x01, 0xf4, 0x82, 0x50, 0xd2, 0xfe, 0xde, 0x50, + 0x01, 0x72, 0xd2, 0xfe, 0x84, 0x01, 0xcc, 0x50, 0xfd, 0xe4, 0x02, 0x6c, 0x00, 0x02, 0x00, 0x00, + 0x00, 0xd2, 0x01, 0xf4, 0x01, 0xc2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1d, 0x40, 0x0d, 0x07, 0x04, + 0x08, 0x03, 0x00, 0x08, 0x03, 0x49, 0x02, 0x07, 0x49, 0x05, 0x0a, 0x00, 0x3f, 0xfd, 0xd6, 0xed, + 0x01, 0x10, 0xd0, 0xc5, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x35, 0x35, 0x21, 0x15, 0x25, 0x35, 0x21, + 0x15, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0xd2, 0x50, 0x50, 0xa0, 0x50, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x27, + 0x40, 0x14, 0x0b, 0x45, 0x0a, 0x07, 0x45, 0x02, 0x05, 0x03, 0x0c, 0x0a, 0x86, 0x09, 0x92, 0x06, + 0x86, 0x05, 0x49, 0x02, 0x01, 0x92, 0x00, 0x3f, 0xd5, 0xed, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd0, + 0xd5, 0x32, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x17, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x13, + 0x23, 0x11, 0x33, 0xd2, 0x50, 0x82, 0x82, 0x50, 0xa0, 0x50, 0x50, 0xaa, 0x01, 0xcc, 0x50, 0x01, + 0xcc, 0xfc, 0x18, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0xf4, + 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x27, 0x40, 0x14, 0x0b, 0x45, 0x0a, 0x07, 0x45, 0x02, + 0x05, 0x04, 0x0d, 0x0a, 0x92, 0x09, 0x86, 0x02, 0x49, 0x05, 0x06, 0x92, 0x01, 0x86, 0x00, 0x3f, + 0x3f, 0xd5, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x32, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x01, + 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x03, 0x33, 0x11, 0x23, 0x01, 0x22, 0x50, 0x82, 0x82, + 0x50, 0xa0, 0x50, 0x50, 0x03, 0x3e, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x03, 0xe8, 0xfc, 0x18, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x0b, 0x00, 0x45, 0x40, 0x2d, + 0x01, 0x0d, 0x0b, 0x40, 0x0f, 0x12, 0x48, 0x0b, 0x45, 0x08, 0x07, 0x40, 0x0f, 0x12, 0x48, 0x07, + 0x45, 0x30, 0x04, 0x60, 0x04, 0x70, 0x04, 0xb0, 0x04, 0xc0, 0x04, 0xd0, 0x04, 0x06, 0x04, 0x03, + 0x0c, 0x0a, 0x86, 0x0b, 0x07, 0x90, 0x02, 0x01, 0x02, 0x49, 0x04, 0x05, 0x86, 0x00, 0x3f, 0xd5, + 0xed, 0x5d, 0x33, 0x33, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xfd, 0x2b, 0xd6, 0xed, 0x2b, 0x10, + 0xc0, 0x31, 0x30, 0x01, 0x15, 0x21, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, + 0xf4, 0xfe, 0x0c, 0x82, 0x50, 0x50, 0x50, 0x01, 0x72, 0x50, 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x01, + 0xcc, 0xfe, 0x34, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x22, 0x01, 0x72, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x09, 0x00, 0x3b, 0x40, 0x25, 0x8f, 0x08, 0x9f, 0x08, 0x02, 0x08, 0x45, 0x09, 0x8f, 0x04, + 0x9f, 0x04, 0x02, 0x04, 0x45, 0x01, 0x00, 0x0a, 0x90, 0x08, 0x01, 0x08, 0xa1, 0x07, 0x86, 0x9f, + 0x01, 0x01, 0x01, 0x49, 0x90, 0x04, 0x01, 0x04, 0xa1, 0x03, 0x86, 0x00, 0x3f, 0x3f, 0x5d, 0xed, + 0x5d, 0x3f, 0x3f, 0x5d, 0x01, 0x10, 0xd0, 0xd5, 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x11, + 0x33, 0x11, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x82, 0x50, 0xd2, 0x01, 0x22, 0x50, 0x50, + 0x01, 0x72, 0x01, 0xcc, 0xfd, 0xe4, 0x02, 0x1c, 0xfd, 0xe4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, + 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x09, 0x00, 0x3b, 0x40, 0x25, 0x80, 0x07, + 0x90, 0x07, 0x02, 0x07, 0x45, 0x06, 0x80, 0x01, 0x90, 0x01, 0x02, 0x01, 0x45, 0x04, 0x00, 0x0b, + 0x09, 0x86, 0x90, 0x06, 0x01, 0x06, 0xa1, 0x03, 0x86, 0x9f, 0x04, 0x01, 0x04, 0x49, 0x90, 0x00, + 0x01, 0x00, 0xa1, 0x00, 0x3f, 0x5d, 0xed, 0x5d, 0x3f, 0x3f, 0x5d, 0x3f, 0x01, 0x10, 0xd0, 0xd5, + 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x05, 0x23, 0x11, + 0x33, 0x01, 0xf4, 0xd2, 0x50, 0x82, 0xfe, 0xde, 0x50, 0x50, 0x01, 0x22, 0x02, 0x1c, 0xfe, 0x34, + 0x50, 0x02, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x0b, + 0x00, 0x40, 0x40, 0x27, 0x80, 0x07, 0x90, 0x07, 0x02, 0x07, 0x45, 0xbf, 0x04, 0x01, 0x04, 0x03, + 0x0d, 0x8f, 0x08, 0x9f, 0x08, 0x02, 0x08, 0x45, 0x30, 0x0b, 0xb0, 0x0b, 0x02, 0x0b, 0x00, 0x0c, + 0x09, 0x92, 0x06, 0x92, 0x04, 0x08, 0x08, 0x0b, 0x49, 0x01, 0x83, 0x00, 0x3f, 0xed, 0x32, 0x11, + 0x33, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, + 0x31, 0x30, 0x11, 0x35, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0xf4, + 0x82, 0x50, 0x50, 0x50, 0x01, 0x22, 0x50, 0x50, 0xfe, 0x34, 0x01, 0xcc, 0xfe, 0x34, 0x01, 0xcc, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, 0x01, 0x72, 0x00, 0x05, 0x00, 0x09, 0x00, 0x43, + 0x40, 0x2a, 0x84, 0x06, 0x94, 0x06, 0x02, 0x06, 0x45, 0xbf, 0x07, 0x01, 0x02, 0x3f, 0x07, 0x01, + 0x20, 0x07, 0x01, 0x07, 0x0b, 0x8f, 0x01, 0x9f, 0x01, 0x02, 0x01, 0x45, 0x04, 0x05, 0x0a, 0x09, + 0x92, 0x07, 0x83, 0x02, 0x92, 0x90, 0x04, 0x01, 0x04, 0x49, 0x01, 0x83, 0x00, 0x3f, 0xed, 0x5d, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0x5d, 0x5f, 0x5d, 0xed, + 0x5d, 0x31, 0x30, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x25, 0x33, 0x11, 0x23, 0xd2, 0x50, 0x82, + 0x01, 0x22, 0x50, 0x50, 0x01, 0x72, 0xfd, 0xe4, 0x01, 0xcc, 0x50, 0xfd, 0xe4, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x05, 0x00, 0x09, 0x00, 0x43, + 0x40, 0x2a, 0x84, 0x04, 0x94, 0x04, 0x02, 0x04, 0x45, 0x01, 0x24, 0x00, 0x01, 0x00, 0x0b, 0x8b, + 0x09, 0x9b, 0x09, 0x02, 0x09, 0x45, 0xb0, 0x08, 0x01, 0x02, 0x30, 0x08, 0x01, 0x08, 0x0a, 0x09, + 0x83, 0x06, 0x92, 0x90, 0x01, 0x01, 0x01, 0x49, 0x04, 0x83, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0xed, + 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5f, 0x5d, 0xed, 0x5d, 0x10, 0xd0, 0x5d, 0xd5, 0xed, + 0x5d, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x01, 0xf4, 0x82, + 0x50, 0xd2, 0xfe, 0xde, 0x50, 0x50, 0x01, 0x22, 0xfe, 0x34, 0x02, 0x1c, 0xfd, 0xe4, 0x02, 0x1c, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x0f, 0xb5, 0x05, + 0x03, 0x03, 0x86, 0x02, 0x92, 0x00, 0x3f, 0x3f, 0x01, 0x2f, 0xc5, 0x31, 0x30, 0x01, 0x11, 0x21, + 0x11, 0x01, 0xf4, 0xfe, 0x0c, 0x03, 0x3e, 0xfc, 0x18, 0x03, 0xe8, 0x00, 0x00, 0x2e, 0x00, 0x00, + 0xff, 0x6e, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, + 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, + 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, + 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, + 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, + 0x00, 0xb7, 0x00, 0x00, 0x11, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, + 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, + 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x9c, 0x27, 0x27, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, + 0x27, 0x27, 0x9c, 0x20, 0x20, 0x03, 0x3e, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x28, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x03, 0xd0, 0x27, 0x27, 0x27, 0x75, + 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x76, 0x27, 0x27, + 0x27, 0x75, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x75, + 0x27, 0x27, 0x27, 0x00, 0x00, 0x55, 0x00, 0x00, 0xff, 0x6e, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, + 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, + 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, + 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, + 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, 0x00, 0xb7, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0xc3, + 0x00, 0xc7, 0x00, 0xcb, 0x00, 0xcf, 0x00, 0xd3, 0x00, 0xd7, 0x00, 0xdb, 0x00, 0xdf, 0x00, 0xe3, + 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x03, + 0x01, 0x07, 0x01, 0x0b, 0x01, 0x0f, 0x01, 0x13, 0x01, 0x17, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x23, + 0x01, 0x27, 0x01, 0x2b, 0x01, 0x2f, 0x01, 0x33, 0x01, 0x37, 0x01, 0x3b, 0x01, 0x3f, 0x01, 0x43, + 0x01, 0x47, 0x01, 0x4b, 0x01, 0x4f, 0x01, 0x53, 0x00, 0x00, 0x11, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x27, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, + 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, + 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x03, 0x3e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x76, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x03, 0x82, 0x27, 0x75, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x76, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x00, 0x00, 0x49, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, + 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, + 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, + 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, + 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, 0x00, 0xb7, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0xc3, + 0x00, 0xc7, 0x00, 0xcb, 0x00, 0xcf, 0x00, 0xd3, 0x00, 0xd7, 0x00, 0xdb, 0x00, 0xdf, 0x00, 0xe3, + 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x03, + 0x01, 0x07, 0x01, 0x0b, 0x01, 0x0f, 0x01, 0x13, 0x01, 0x17, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x3b, + 0x00, 0x00, 0x13, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x13, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, + 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x27, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x47, 0x20, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x02, 0xf0, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x76, 0x28, + 0x28, 0x28, 0x27, 0x27, 0x27, 0x27, 0x76, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x27, 0x76, 0x28, + 0x28, 0x28, 0x76, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x03, 0x82, 0xfc, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x03, 0xe8, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x13, 0x00, 0x57, 0x40, 0x36, 0x06, 0x80, 0x11, 0x90, + 0x11, 0x02, 0x11, 0x45, 0x00, 0x3f, 0x03, 0xbf, 0x03, 0x02, 0x03, 0x02, 0x15, 0x07, 0x8f, 0x10, + 0x9f, 0x10, 0x02, 0x10, 0x45, 0x0a, 0x30, 0x0d, 0xb0, 0x0d, 0x02, 0x0d, 0x0b, 0x14, 0x13, 0x86, + 0x0a, 0x03, 0x80, 0x07, 0x90, 0x07, 0x02, 0x07, 0x49, 0x0d, 0x00, 0x10, 0x0f, 0x86, 0x08, 0x92, + 0x04, 0x92, 0x00, 0x3f, 0x3f, 0x3f, 0xd5, 0x32, 0x32, 0xed, 0x5d, 0x32, 0x32, 0x3f, 0x01, 0x10, + 0xd0, 0xd5, 0x5d, 0x32, 0xed, 0x5d, 0x32, 0x10, 0xd0, 0xd5, 0x5d, 0x32, 0xed, 0x5d, 0x32, 0x31, + 0x30, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, + 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0x72, 0x82, 0x82, 0x50, 0x50, 0x50, 0x82, 0x82, 0x50, 0x50, + 0x50, 0x01, 0x72, 0x50, 0xfe, 0x34, 0x01, 0xcc, 0xfe, 0x34, 0x01, 0xcc, 0x50, 0x01, 0xcc, 0xfe, + 0x34, 0x01, 0xcc, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x13, + 0x00, 0x31, 0x40, 0x18, 0x13, 0x0f, 0x01, 0x02, 0x45, 0x0c, 0x08, 0x05, 0x06, 0x14, 0x05, 0x02, + 0x49, 0x08, 0x13, 0x09, 0x12, 0x49, 0x0c, 0x0f, 0x0e, 0x86, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0xd5, + 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x01, 0x10, 0xd0, 0xd5, 0x32, 0x32, 0xfd, 0xc5, 0x33, + 0x33, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, + 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x01, 0xf4, 0xd2, 0x50, 0xd2, 0xd2, 0xd2, 0xd2, 0x50, + 0xd2, 0xd2, 0x01, 0x22, 0x50, 0xfe, 0x84, 0x01, 0x7c, 0x50, 0x50, 0x50, 0x01, 0x7c, 0xfe, 0x84, + 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x49, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x54, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x10, 0x00, 0x75, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0c, + 0x00, 0x85, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x91, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x0f, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0f, + 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0xef, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0xef, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x0b, 0x00, 0x49, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x04, + 0x00, 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x10, 0x00, 0x75, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x92, 0x01, 0x09, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x01, 0x00, 0x16, 0x01, 0x9b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, + 0x01, 0xb1, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x3a, 0x01, 0xb9, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x20, 0x01, 0xf3, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x05, 0x00, 0x18, 0x02, 0x13, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x1e, + 0x02, 0x2b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x80, 0x02, 0x49, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x1e, 0x02, 0xc9, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x09, 0x00, 0x1e, 0x02, 0xc9, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x34, + 0x02, 0xe7, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x34, 0x02, 0xe7, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x10, 0x00, 0x16, 0x01, 0x9b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x11, 0x00, 0x08, 0x01, 0xb1, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x12, 0x00, 0x20, + 0x01, 0xf3, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, + 0x20, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x20, + 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x31, 0x2e, 0x30, 0x55, 0x62, 0x75, 0x6e, 0x74, + 0x75, 0x20, 0x4d, 0x6f, 0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x64, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, + 0x20, 0x4d, 0x6f, 0x6e, 0x6f, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x30, 0x2e, 0x38, 0x30, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x4d, 0x6f, + 0x6e, 0x6f, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, + 0x2e, 0x38, 0x30, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x4d, 0x6f, 0x6e, 0x6f, 0x2d, 0x42, 0x6f, + 0x6c, 0x64, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x61, 0x6e, + 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x74, + 0x64, 0x2e, 0x44, 0x61, 0x6c, 0x74, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x61, 0x67, 0x20, 0x4c, 0x74, + 0x64, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x61, 0x6c, 0x74, + 0x6f, 0x6e, 0x6d, 0x61, 0x61, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x00, 0x43, 0x00, 0x6f, 0x00, + 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, + 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6e, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x4c, 0x00, + 0x74, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, + 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, + 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, + 0x55, 0x00, 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x46, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, + 0x6e, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x55, 0x00, + 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x6f, 0x00, + 0x6e, 0x00, 0x6f, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x55, 0x00, 0x62, 0x00, + 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x6e, 0x00, + 0x6f, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x56, 0x00, + 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x30, 0x00, + 0x2e, 0x00, 0x38, 0x00, 0x30, 0x00, 0x55, 0x00, 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, + 0x75, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x42, 0x00, + 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x30, 0x00, 0x55, 0x00, + 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x6e, 0x00, + 0x6f, 0x00, 0x2d, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x55, 0x00, 0x62, 0x00, + 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, + 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, + 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, + 0x65, 0x00, 0x67, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, + 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, + 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, + 0x43, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, + 0x6c, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x74, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x44, 0x00, 0x61, 0x00, + 0x6c, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x61, 0x00, + 0x67, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x74, 0x00, 0x64, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, + 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, + 0x64, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6d, 0x00, 0x61, 0x00, + 0x61, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x85, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x10, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, + 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, + 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, + 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, + 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, + 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, + 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, + 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, + 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, + 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, + 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x01, 0x03, 0x00, 0xc4, 0x00, 0xa6, 0x00, 0xc5, 0x00, 0xab, + 0x00, 0x82, 0x00, 0xc2, 0x00, 0xd8, 0x00, 0xc6, 0x00, 0xe4, 0x00, 0xbe, 0x00, 0xb0, 0x00, 0xb6, + 0x00, 0xb7, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x87, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xd9, 0x00, 0x8c, + 0x00, 0xe5, 0x00, 0xbf, 0x00, 0xb1, 0x00, 0xbb, 0x01, 0x04, 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, + 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, + 0x00, 0xa4, 0x01, 0x05, 0x00, 0x8a, 0x01, 0x06, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, + 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, 0x01, 0x07, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, + 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, + 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, + 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, + 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, + 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, + 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, + 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, + 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, + 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, + 0x01, 0x0c, 0x01, 0x0d, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, + 0x00, 0xff, 0x01, 0x00, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, + 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, + 0x01, 0x20, 0x01, 0x21, 0x00, 0xf8, 0x00, 0xf9, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, + 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, + 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, 0x01, 0x31, 0x01, 0x32, 0x00, 0xd7, 0x01, 0x33, 0x01, 0x34, + 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, + 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x00, 0xe2, + 0x00, 0xe3, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, + 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, + 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, + 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x00, 0xfb, 0x00, 0xfc, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, + 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, + 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, + 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x00, 0xe6, + 0x00, 0xe7, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, + 0x00, 0xe1, 0x01, 0x7f, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xdf, 0x01, 0x80, + 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x00, 0xbc, + 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, + 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, + 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, + 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, + 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, + 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x00, 0x98, 0x01, 0xb3, 0x00, 0x9a, 0x00, 0x99, 0x01, 0xb4, + 0x00, 0xef, 0x01, 0xb5, 0x01, 0xb6, 0x00, 0xa5, 0x00, 0x92, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0x8f, + 0x00, 0x94, 0x00, 0x95, 0x00, 0xb9, 0x00, 0xc0, 0x01, 0xb7, 0x00, 0xc1, 0x01, 0xb8, 0x01, 0xb9, + 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, + 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, + 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, + 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, + 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, + 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, + 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, + 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, + 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, 0x02, 0x01, + 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, + 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, + 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, + 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, + 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, + 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, + 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, + 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, + 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, + 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, + 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, + 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, + 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, + 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, + 0x02, 0x72, 0x02, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x79, + 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, + 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, + 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, + 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, + 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, + 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, + 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, + 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, + 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, + 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0xc9, + 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, + 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, + 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, + 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, + 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, + 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, + 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, + 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, + 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, + 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, + 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, + 0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, 0x03, 0x29, + 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x31, + 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, + 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, + 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, + 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, + 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, + 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, + 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, + 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, + 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, + 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, + 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, + 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, + 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, + 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, + 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, + 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, + 0x03, 0xb2, 0x00, 0x9f, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, + 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, + 0x03, 0xc1, 0x00, 0x9b, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, + 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, + 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, + 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, + 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, 0x03, 0xe7, + 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xed, 0x03, 0xee, 0x03, 0xef, + 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, + 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, + 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, + 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, + 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, + 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, + 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, + 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, + 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, + 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, + 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x45, 0x04, 0x46, 0x04, 0x47, + 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f, + 0x04, 0x50, 0x04, 0x51, 0x04, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, 0x04, 0x56, 0x04, 0x57, + 0x04, 0x58, 0x04, 0x59, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x5e, 0x04, 0x5f, + 0x04, 0x60, 0x04, 0x61, 0x04, 0x62, 0x04, 0x63, 0x04, 0x64, 0x04, 0x65, 0x04, 0x66, 0x04, 0x67, + 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6e, 0x04, 0x6f, + 0x04, 0x70, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x74, 0x04, 0x75, 0x04, 0x76, 0x04, 0x77, + 0x04, 0x78, 0x04, 0x79, 0x04, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, + 0x04, 0x80, 0x04, 0x81, 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, + 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, + 0x04, 0x90, 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, 0x04, 0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0x97, + 0x04, 0x98, 0x04, 0x99, 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, + 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa7, + 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xac, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, + 0x04, 0xb0, 0x04, 0xb1, 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb7, + 0x04, 0xb8, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, 0xbc, 0x04, 0xbd, 0x04, 0xbe, 0x04, 0xbf, + 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, + 0x04, 0xc8, 0x04, 0xc9, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, + 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, + 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, + 0x04, 0xe0, 0x04, 0xe1, 0x04, 0xe2, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, + 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, + 0x05, 0x1e, 0x05, 0x1f, 0x05, 0x20, 0x05, 0x21, 0x05, 0x22, 0x04, 0xf5, 0x04, 0xf6, 0x05, 0x23, + 0x04, 0xf8, 0x04, 0xf9, 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xfc, 0x04, 0xfd, 0x04, 0xfe, 0x04, 0xff, + 0x05, 0x00, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x07, + 0x05, 0x08, 0x05, 0x09, 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0x0e, 0x05, 0x0f, + 0x05, 0x10, 0x05, 0x11, 0x05, 0x12, 0x05, 0x13, 0x05, 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, + 0x05, 0x18, 0x05, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x30, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, 0x44, 0x06, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x6e, 0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x07, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x61, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x61, 0x62, 0x72, 0x65, 0x76, + 0x65, 0x07, 0x41, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, + 0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x63, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x43, 0x64, 0x6f, 0x74, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x63, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, + 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, + 0x72, 0x6f, 0x61, 0x74, 0x06, 0x64, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x07, 0x45, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x6e, 0x07, 0x65, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, + 0x76, 0x65, 0x06, 0x65, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, + 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, + 0x45, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x47, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x67, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x47, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, + 0x0a, 0x67, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x47, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, + 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, + 0x78, 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x04, 0x48, 0x62, + 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, 0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, + 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x69, 0x62, 0x72, + 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, + 0x6e, 0x65, 0x6b, 0x0a, 0x49, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x69, + 0x2e, 0x6c, 0x6f, 0x63, 0x6c, 0x02, 0x49, 0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, + 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, + 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, + 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x11, 0x6b, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0c, + 0x6b, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, + 0x75, 0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, + 0x6f, 0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, 0x4e, 0x61, 0x63, + 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, 0x63, 0x61, 0x72, + 0x6f, 0x6e, 0x10, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x2e, 0x63, + 0x61, 0x73, 0x65, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, + 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, 0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, + 0x6f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x6f, + 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, + 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, + 0x74, 0x06, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, + 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, + 0x06, 0x72, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x73, + 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, + 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x36, 0x33, 0x06, 0x54, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, 0x54, 0x62, 0x61, 0x72, + 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, + 0x6c, 0x64, 0x65, 0x07, 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, 0x62, 0x72, 0x65, 0x76, + 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, + 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, + 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, 0x67, 0x6f, 0x6e, 0x65, + 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, + 0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x79, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, + 0x06, 0x7a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, + 0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x05, 0x6c, 0x6f, + 0x6e, 0x67, 0x73, 0x0c, 0x53, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, + 0x0c, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x32, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x42, 0x08, 0x64, 0x6f, + 0x74, 0x6c, 0x65, 0x73, 0x73, 0x6a, 0x0a, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, + 0x65, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x39, 0x06, 0x57, 0x67, 0x72, 0x61, 0x76, 0x65, + 0x06, 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x57, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x77, + 0x61, 0x63, 0x75, 0x74, 0x65, 0x09, 0x57, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, + 0x77, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, + 0x06, 0x79, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0c, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x6f, 0x75, 0x72, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x72, 0x0c, 0x66, 0x69, 0x76, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0b, 0x73, + 0x69, 0x78, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x73, 0x65, 0x76, 0x65, 0x6e, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x6e, 0x69, 0x6e, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x72, 0x0c, 0x7a, 0x65, 0x72, 0x6f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, + 0x0b, 0x6f, 0x6e, 0x65, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0b, 0x74, 0x77, 0x6f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x65, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x6f, 0x75, 0x72, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x69, 0x76, 0x65, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, + 0x0b, 0x73, 0x69, 0x78, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x73, 0x65, 0x76, + 0x65, 0x6e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x6e, 0x69, 0x6e, 0x65, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x69, 0x6f, 0x72, 0x09, 0x61, 0x66, 0x69, 0x69, 0x36, 0x31, 0x32, 0x38, 0x39, 0x09, + 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x08, 0x6f, 0x6e, 0x65, 0x74, 0x68, 0x69, + 0x72, 0x64, 0x09, 0x74, 0x77, 0x6f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x73, 0x09, 0x6f, 0x6e, 0x65, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x0c, + 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x08, 0x6f, 0x6e, 0x65, + 0x66, 0x69, 0x66, 0x74, 0x68, 0x09, 0x74, 0x77, 0x6f, 0x66, 0x69, 0x66, 0x74, 0x68, 0x73, 0x0b, + 0x74, 0x68, 0x72, 0x65, 0x65, 0x66, 0x69, 0x66, 0x74, 0x68, 0x73, 0x0a, 0x66, 0x6f, 0x75, 0x72, + 0x66, 0x69, 0x66, 0x74, 0x68, 0x73, 0x08, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x78, 0x74, 0x68, 0x0a, + 0x66, 0x69, 0x76, 0x65, 0x73, 0x69, 0x78, 0x74, 0x68, 0x73, 0x0a, 0x6f, 0x6e, 0x65, 0x73, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x68, 0x0b, 0x74, 0x77, 0x6f, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, + 0x73, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, 0x73, 0x0c, + 0x66, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, 0x73, 0x0c, 0x66, 0x69, 0x76, + 0x65, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, 0x73, 0x0b, 0x73, 0x69, 0x78, 0x73, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x68, 0x73, 0x08, 0x6f, 0x6e, 0x65, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x09, 0x74, + 0x77, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x0a, 0x66, 0x6f, 0x75, 0x72, 0x6e, 0x69, 0x6e, + 0x74, 0x68, 0x73, 0x0a, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x0b, 0x73, + 0x65, 0x76, 0x65, 0x6e, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x0b, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x05, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, + 0x32, 0x31, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x32, 0x32, 0x31, 0x39, 0x03, 0x66, 0x5f, 0x69, 0x03, 0x66, 0x5f, 0x6c, 0x09, 0x7a, 0x65, 0x72, + 0x6f, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x08, 0x6f, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x08, + 0x74, 0x77, 0x6f, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, 0x73, + 0x75, 0x70, 0x73, 0x09, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x09, 0x66, 0x69, + 0x76, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x08, 0x73, 0x69, 0x78, 0x2e, 0x73, 0x75, 0x70, 0x73, + 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x0a, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x73, + 0x09, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x08, 0x6f, 0x6e, 0x65, 0x2e, 0x73, + 0x69, 0x6e, 0x66, 0x08, 0x74, 0x77, 0x6f, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x0a, 0x74, 0x68, 0x72, + 0x65, 0x65, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x09, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x73, 0x69, 0x6e, + 0x66, 0x09, 0x66, 0x69, 0x76, 0x65, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x08, 0x73, 0x69, 0x78, 0x2e, + 0x73, 0x69, 0x6e, 0x66, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x0a, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, + 0x73, 0x69, 0x6e, 0x66, 0x09, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0e, 0x72, 0x65, 0x76, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0f, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, + 0x61, 0x6c, 0x74, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x09, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x6c, + 0x65, 0x66, 0x74, 0x0a, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x06, 0x48, + 0x79, 0x70, 0x68, 0x65, 0x6e, 0x05, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x02, 0x41, 0x74, 0x0b, 0x42, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x09, 0x42, 0x61, 0x63, 0x6b, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x0c, 0x42, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x09, 0x42, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x0a, 0x42, 0x72, 0x61, 0x63, + 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0d, 0x47, 0x75, 0x69, 0x6c, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x6c, 0x65, 0x66, 0x74, 0x06, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x06, 0x45, 0x6e, 0x64, 0x61, + 0x73, 0x68, 0x06, 0x45, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x0e, 0x47, 0x75, 0x69, 0x6c, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x45, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, + 0x6f, 0x77, 0x6e, 0x0d, 0x47, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x6c, 0x65, 0x66, + 0x74, 0x0e, 0x47, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x0c, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x77, 0x6e, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x34, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x41, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x46, 0x05, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x6f, 0x68, 0x6f, 0x72, + 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x45, 0x05, 0x55, 0x68, 0x6f, 0x72, 0x6e, 0x05, + 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x35, 0x06, 0x47, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x39, 0x0a, 0x41, 0x72, 0x69, 0x6e, + 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x61, 0x65, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x0b, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x32, 0x0e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x5f, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, + 0x67, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x75, 0x74, 0x65, + 0x0f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, + 0x0a, 0x64, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x0e, 0x64, 0x69, 0x65, 0x72, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0e, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x5f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0c, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x5f, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x63, 0x0e, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x61, 0x73, 0x63, 0x09, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x61, 0x73, 0x63, 0x12, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, + 0x73, 0x5f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x63, 0x61, 0x70, 0x12, 0x64, 0x69, 0x65, 0x72, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x63, 0x61, 0x70, 0x12, 0x64, + 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x61, + 0x70, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x32, 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x35, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x35, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x39, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, + 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x44, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x36, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x34, 0x35, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x31, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x31, + 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x31, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x32, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x31, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x32, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x35, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, + 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x32, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x30, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x31, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x33, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x33, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, + 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x33, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x38, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x34, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x34, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x34, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x39, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, + 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x36, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x39, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x37, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x33, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, + 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x37, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x38, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x38, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x38, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x38, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x39, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, + 0x31, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x39, 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x34, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x39, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x34, 0x35, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x31, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x31, 0x30, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x31, 0x30, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x31, 0x30, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x34, 0x35, 0x44, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x31, 0x30, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x39, 0x33, 0x0e, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x36, 0x36, 0x2e, 0x6c, 0x6f, 0x63, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x43, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x46, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, + 0x35, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x09, 0x61, 0x66, 0x69, + 0x69, 0x36, 0x31, 0x33, 0x35, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x30, 0x30, 0x32, 0x30, 0x38, + 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x45, + 0x05, 0x74, 0x65, 0x6e, 0x67, 0x65, 0x06, 0x72, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x06, 0x6b, 0x72, + 0x61, 0x74, 0x6b, 0x61, 0x05, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, + 0x47, 0x61, 0x6d, 0x6d, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x39, 0x34, 0x07, 0x45, 0x70, + 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, 0x54, + 0x68, 0x65, 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x06, + 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, 0x4d, 0x75, 0x02, 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, + 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, 0x53, + 0x69, 0x67, 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, + 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, 0x69, 0x03, 0x50, 0x73, 0x69, 0x05, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, 0x61, 0x05, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x07, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, 0x74, 0x61, + 0x03, 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, 0x04, 0x69, 0x6f, 0x74, 0x61, 0x05, + 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x33, 0x42, 0x43, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, + 0x67, 0x6d, 0x61, 0x03, 0x74, 0x61, 0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, + 0x70, 0x68, 0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, 0x6d, 0x65, 0x67, + 0x61, 0x0a, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x45, 0x70, 0x73, + 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, 0x74, 0x6f, 0x6e, + 0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x49, 0x6f, 0x74, + 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, + 0x6e, 0x6f, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, + 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, + 0x69, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, + 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, + 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, + 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, + 0x6f, 0x73, 0x05, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x2e, 0x63, + 0x61, 0x70, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x36, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x38, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x41, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x30, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x30, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x36, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x38, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x41, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x43, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x45, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x41, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x38, 0x42, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x44, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x38, 0x46, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x39, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x39, 0x42, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x39, 0x46, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x38, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x41, 0x42, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x45, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x41, 0x46, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, 0x2e, 0x61, 0x6c, 0x74, 0x07, 0x75, 0x6e, 0x69, + 0x32, 0x30, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x46, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x45, 0x46, 0x46, 0x44, 0x0c, 0x53, 0x46, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, + 0x31, 0x0c, 0x53, 0x46, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, + 0x46, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x31, 0x31, + 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, 0x39, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, + 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, + 0x53, 0x46, 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, + 0x38, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, 0x35, 0x30, 0x30, + 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x2e, + 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x35, 0x33, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, + 0x0c, 0x53, 0x46, 0x30, 0x33, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x08, 0x53, 0x46, + 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, + 0x53, 0x46, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x38, 0x30, 0x30, 0x30, + 0x30, 0x08, 0x53, 0x46, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x37, 0x30, + 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, + 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, + 0x46, 0x34, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, + 0x08, 0x53, 0x46, 0x34, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x38, + 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, + 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, + 0x53, 0x46, 0x34, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x08, 0x53, 0x46, 0x33, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x36, 0x30, + 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, + 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, + 0x46, 0x32, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x6c, 0x74, 0x73, 0x68, 0x61, 0x64, 0x65, 0x05, 0x73, + 0x68, 0x61, 0x64, 0x65, 0x07, 0x64, 0x6b, 0x73, 0x68, 0x61, 0x64, 0x65, 0x08, 0x53, 0x46, 0x35, + 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, + 0x46, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x08, 0x53, 0x46, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x31, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x08, 0x53, 0x46, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x39, + 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, + 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, + 0x53, 0x46, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x33, 0x30, 0x30, 0x30, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0a, 0x01, 0x74, 0x07, 0x16, 0x00, 0x03, 0x63, 0x79, 0x72, 0x6c, 0x00, 0x14, 0x67, 0x72, + 0x65, 0x6b, 0x00, 0x90, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0xb0, 0x00, 0x16, 0x00, 0x03, 0x42, 0x47, + 0x52, 0x20, 0x00, 0x2e, 0x4d, 0x4b, 0x44, 0x20, 0x00, 0x48, 0x53, 0x52, 0x42, 0x20, 0x00, 0x62, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x30, + 0x00, 0x3e, 0x00, 0x4b, 0x00, 0x56, 0x00, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x01, + 0x00, 0x0c, 0x00, 0x15, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x3f, 0x00, 0x4c, 0x00, 0x57, + 0x00, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x21, + 0x00, 0x2b, 0x00, 0x32, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x63, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x41, + 0x00, 0x4e, 0x00, 0x59, 0x00, 0x64, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, + 0x00, 0x04, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x23, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x49, + 0x00, 0x4f, 0x00, 0x5a, 0x00, 0x65, 0x00, 0x22, 0x00, 0x05, 0x41, 0x5a, 0x45, 0x20, 0x00, 0x40, + 0x43, 0x52, 0x54, 0x20, 0x00, 0x5a, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0x74, 0x52, 0x4f, 0x4d, 0x20, + 0x00, 0x8a, 0x54, 0x52, 0x4b, 0x20, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x05, + 0x00, 0x10, 0x00, 0x19, 0x00, 0x24, 0x00, 0x35, 0x00, 0x3b, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x4a, + 0x00, 0x50, 0x00, 0x5b, 0x00, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x11, + 0x00, 0x1a, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x44, 0x00, 0x51, 0x00, 0x5c, 0x00, 0x67, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x2e, + 0x00, 0x37, 0x00, 0x45, 0x00, 0x52, 0x00, 0x5d, 0x00, 0x68, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x38, 0x00, 0x46, 0x00, 0x53, 0x00, 0x5e, 0x00, 0x69, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x39, 0x00, 0x47, + 0x00, 0x54, 0x00, 0x5f, 0x00, 0x6a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x13, + 0x00, 0x1e, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x3a, 0x00, 0x48, 0x00, 0x55, 0x00, 0x60, 0x00, 0x6b, + 0x00, 0x6c, 0x61, 0x66, 0x72, 0x63, 0x02, 0x8a, 0x61, 0x66, 0x72, 0x63, 0x02, 0x94, 0x61, 0x66, + 0x72, 0x63, 0x02, 0x9e, 0x61, 0x66, 0x72, 0x63, 0x02, 0xa8, 0x61, 0x66, 0x72, 0x63, 0x02, 0xb2, + 0x61, 0x66, 0x72, 0x63, 0x02, 0xbc, 0x61, 0x66, 0x72, 0x63, 0x02, 0xc6, 0x61, 0x66, 0x72, 0x63, + 0x02, 0xd0, 0x61, 0x66, 0x72, 0x63, 0x02, 0xda, 0x61, 0x66, 0x72, 0x63, 0x02, 0xe4, 0x61, 0x66, + 0x72, 0x63, 0x02, 0xee, 0x63, 0x61, 0x73, 0x65, 0x02, 0xf8, 0x63, 0x61, 0x73, 0x65, 0x03, 0x00, + 0x63, 0x61, 0x73, 0x65, 0x03, 0x08, 0x63, 0x61, 0x73, 0x65, 0x03, 0x10, 0x63, 0x61, 0x73, 0x65, + 0x03, 0x18, 0x63, 0x61, 0x73, 0x65, 0x03, 0x20, 0x63, 0x61, 0x73, 0x65, 0x03, 0x28, 0x63, 0x61, + 0x73, 0x65, 0x03, 0x30, 0x63, 0x61, 0x73, 0x65, 0x03, 0x38, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x40, + 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x46, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x4c, 0x64, 0x6e, 0x6f, 0x6d, + 0x03, 0x52, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x58, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x5e, 0x64, 0x6e, + 0x6f, 0x6d, 0x03, 0x64, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x6a, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x70, + 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x76, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x7c, 0x66, 0x72, 0x61, 0x63, + 0x03, 0x82, 0x66, 0x72, 0x61, 0x63, 0x03, 0x8a, 0x66, 0x72, 0x61, 0x63, 0x03, 0x92, 0x66, 0x72, + 0x61, 0x63, 0x03, 0x9a, 0x66, 0x72, 0x61, 0x63, 0x03, 0xa2, 0x66, 0x72, 0x61, 0x63, 0x03, 0xaa, + 0x66, 0x72, 0x61, 0x63, 0x03, 0xb2, 0x66, 0x72, 0x61, 0x63, 0x03, 0xba, 0x66, 0x72, 0x61, 0x63, + 0x03, 0xc2, 0x66, 0x72, 0x61, 0x63, 0x03, 0xca, 0x66, 0x72, 0x61, 0x63, 0x03, 0xd2, 0x6c, 0x6f, + 0x63, 0x6c, 0x03, 0xda, 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xe0, 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xe6, + 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xec, 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xf2, 0x6c, 0x6f, 0x63, 0x6c, + 0x03, 0xf8, 0x6e, 0x75, 0x6d, 0x72, 0x03, 0xfe, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x04, 0x6e, 0x75, + 0x6d, 0x72, 0x04, 0x0a, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x10, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x16, + 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x1c, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x22, 0x6e, 0x75, 0x6d, 0x72, + 0x04, 0x28, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x2e, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x34, 0x6e, 0x75, + 0x6d, 0x72, 0x04, 0x3a, 0x6f, 0x72, 0x64, 0x6e, 0x04, 0x40, 0x73, 0x61, 0x6c, 0x74, 0x04, 0x46, + 0x73, 0x61, 0x6c, 0x74, 0x04, 0x50, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x5a, 0x73, 0x69, 0x6e, 0x66, + 0x04, 0x60, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x66, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x6c, 0x73, 0x69, + 0x6e, 0x66, 0x04, 0x72, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x78, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x7e, + 0x73, 0x69, 0x6e, 0x66, 0x04, 0x84, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x8a, 0x73, 0x69, 0x6e, 0x66, + 0x04, 0x90, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x96, 0x73, 0x73, 0x30, 0x31, 0x04, 0x9c, 0x73, 0x73, + 0x30, 0x31, 0x04, 0xa6, 0x73, 0x73, 0x30, 0x32, 0x04, 0xb0, 0x73, 0x73, 0x30, 0x32, 0x04, 0xba, + 0x73, 0x73, 0x30, 0x32, 0x04, 0xc4, 0x73, 0x73, 0x30, 0x32, 0x04, 0xce, 0x73, 0x73, 0x30, 0x32, + 0x04, 0xd8, 0x73, 0x73, 0x30, 0x32, 0x04, 0xe2, 0x73, 0x73, 0x30, 0x32, 0x04, 0xec, 0x73, 0x73, + 0x30, 0x32, 0x04, 0xf6, 0x73, 0x73, 0x30, 0x32, 0x05, 0x00, 0x73, 0x73, 0x30, 0x32, 0x05, 0x0a, + 0x73, 0x73, 0x30, 0x32, 0x05, 0x14, 0x73, 0x75, 0x62, 0x73, 0x05, 0x1e, 0x73, 0x75, 0x62, 0x73, + 0x05, 0x24, 0x73, 0x75, 0x62, 0x73, 0x05, 0x2a, 0x73, 0x75, 0x62, 0x73, 0x05, 0x30, 0x73, 0x75, + 0x62, 0x73, 0x05, 0x36, 0x73, 0x75, 0x62, 0x73, 0x05, 0x3c, 0x73, 0x75, 0x62, 0x73, 0x05, 0x42, + 0x73, 0x75, 0x62, 0x73, 0x05, 0x48, 0x73, 0x75, 0x62, 0x73, 0x05, 0x4e, 0x73, 0x75, 0x62, 0x73, + 0x05, 0x54, 0x73, 0x75, 0x62, 0x73, 0x05, 0x5a, 0x73, 0x75, 0x70, 0x73, 0x05, 0x60, 0x73, 0x75, + 0x70, 0x73, 0x05, 0x66, 0x73, 0x75, 0x70, 0x73, 0x05, 0x6c, 0x73, 0x75, 0x70, 0x73, 0x05, 0x72, + 0x73, 0x75, 0x70, 0x73, 0x05, 0x78, 0x73, 0x75, 0x70, 0x73, 0x05, 0x7e, 0x73, 0x75, 0x70, 0x73, + 0x05, 0x84, 0x73, 0x75, 0x70, 0x73, 0x05, 0x8a, 0x73, 0x75, 0x70, 0x73, 0x05, 0x90, 0x73, 0x75, + 0x70, 0x73, 0x05, 0x96, 0x73, 0x75, 0x70, 0x73, 0x05, 0x9c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x09, 0x00, 0x17, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, + 0x00, 0xa0, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xd0, 0x00, 0xd8, + 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xb6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xb2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xae, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xac, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xfa, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfc, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x98, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x01, 0xe6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x36, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x32, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1d, 0x34, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1d, 0x8c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1d, 0xb4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1e, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0xc0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1e, 0xd0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x01, 0x1e, 0xf2, 0x00, 0xc1, + 0x00, 0x01, 0x1e, 0xec, 0x00, 0xc1, 0x00, 0x01, 0x1e, 0xe6, 0x00, 0xc1, 0x00, 0x01, 0x1e, 0xe6, + 0x00, 0x2f, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x2f, 0x00, 0x01, 0x1e, 0xda, 0x00, 0x2f, 0x00, 0x02, + 0x1e, 0xda, 0x00, 0x28, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, + 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, + 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, + 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, + 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, + 0x01, 0x74, 0x01, 0x75, 0x00, 0x02, 0x1e, 0x9a, 0x00, 0x02, 0x00, 0x85, 0x00, 0x95, 0x00, 0x02, + 0x1e, 0x98, 0x00, 0x28, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, + 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x78, 0x01, 0x79, 0x01, 0x77, 0x01, 0x76, + 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x76, 0x01, 0x77, + 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, + 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, + 0x01, 0x7e, 0x01, 0x7f, 0x00, 0x02, 0x1e, 0x64, 0x00, 0x28, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, + 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb0, + 0x01, 0xb1, 0x01, 0xaf, 0x01, 0xae, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, + 0x01, 0xb7, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, + 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, + 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x00, 0x02, 0x1e, 0x30, 0x00, 0x28, + 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, + 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xb9, 0x01, 0xb8, 0x01, 0xbc, 0x01, 0xbd, + 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, + 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xb8, 0x01, 0xb9, + 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, + 0x00, 0x02, 0x1d, 0xda, 0x00, 0x28, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, + 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xb9, + 0x01, 0xb8, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xb8, + 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, + 0x01, 0xc1, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, + 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x00, 0x02, 0x1d, 0xa6, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, + 0x00, 0x01, 0x1d, 0xa4, 0x00, 0x28, 0x00, 0x56, 0x01, 0xe8, 0x02, 0xb2, 0x03, 0x7c, 0x04, 0x14, + 0x04, 0xde, 0x05, 0x12, 0x05, 0x78, 0x05, 0xac, 0x06, 0x76, 0x07, 0x40, 0x08, 0xd2, 0x09, 0x6a, + 0x0a, 0x34, 0x0a, 0x68, 0x0a, 0xce, 0x0b, 0x02, 0x0c, 0x94, 0x0d, 0x5e, 0x0e, 0x28, 0x0e, 0xc0, + 0x0f, 0x8a, 0x0f, 0xbe, 0x10, 0x24, 0x10, 0x58, 0x11, 0xea, 0x12, 0xb4, 0x13, 0x7e, 0x14, 0x16, + 0x14, 0xe0, 0x15, 0x14, 0x15, 0x7a, 0x15, 0xae, 0x17, 0x40, 0x18, 0x0a, 0x18, 0xd4, 0x19, 0x6c, + 0x1a, 0x36, 0x1a, 0x6a, 0x1a, 0xd0, 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, + 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, + 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, + 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, + 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, + 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, + 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, + 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, + 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, + 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, + 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, 0x00, 0x20, + 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, + 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, + 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, + 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, + 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, + 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, + 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, + 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, + 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, + 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, + 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, + 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, + 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, + 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, + 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc1, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, + 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, + 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, + 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, + 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, + 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, + 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, + 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, + 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc1, 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, + 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, + 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, + 0x01, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, + 0x01, 0x42, 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, + 0x01, 0x82, 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, + 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, + 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, + 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, + 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, + 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, + 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, + 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, + 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, + 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, + 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, + 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, + 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, + 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, + 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, + 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, + 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, + 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, + 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, + 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, + 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, + 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, + 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, + 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, + 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, + 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, + 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x28, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, + 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, 0x01, 0x0a, + 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, 0x01, 0x4a, + 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, 0x01, 0x8a, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, + 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, + 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, + 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, + 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, + 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, + 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, + 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, + 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, + 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, + 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, + 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x02, 0x02, 0x98, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x02, + 0x02, 0x0a, 0x00, 0x28, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, + 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, + 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, + 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, + 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, + 0x01, 0x74, 0x01, 0x75, 0x00, 0x03, 0x00, 0x01, 0x02, 0x6e, 0x00, 0x01, 0x02, 0x7e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x02, 0x82, 0x00, 0x15, 0x01, 0xc6, 0x01, 0xc7, + 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, + 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, + 0x01, 0xd8, 0x00, 0x36, 0x00, 0x2d, 0x00, 0x02, 0x02, 0x80, 0x00, 0x7f, 0x00, 0x24, 0x00, 0x25, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, + 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, + 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, + 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, + 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, + 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, + 0x00, 0xb1, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, + 0x00, 0x7a, 0x00, 0xdb, 0x00, 0xdd, 0x00, 0xdf, 0x00, 0xe1, 0x00, 0xe3, 0x00, 0xe5, 0x00, 0xe7, + 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0x00, 0xef, 0x00, 0xf1, 0x00, 0xf3, 0x00, 0xf5, 0x00, 0xf7, + 0x00, 0xf9, 0x00, 0xfb, 0x00, 0xfd, 0x00, 0xff, 0x01, 0x01, 0x01, 0x03, 0x01, 0x05, 0x01, 0x07, + 0x01, 0x09, 0x01, 0x0b, 0x01, 0x0e, 0x01, 0x10, 0x01, 0x12, 0x01, 0x14, 0x01, 0x16, 0x01, 0x18, + 0x01, 0x1a, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x20, 0x01, 0x22, 0x01, 0x24, 0x01, 0x26, 0x01, 0x28, + 0x01, 0x2a, 0x01, 0x2c, 0x01, 0x2e, 0x01, 0x30, 0x01, 0x32, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, + 0x01, 0x3a, 0x01, 0x3c, 0x01, 0x3e, 0x01, 0x40, 0x01, 0x42, 0x01, 0x44, 0x01, 0x46, 0x01, 0x48, + 0x01, 0x4a, 0x01, 0x4c, 0x01, 0x4e, 0x01, 0x50, 0x01, 0x52, 0x01, 0x54, 0x01, 0x56, 0x01, 0x59, + 0x01, 0x5b, 0x01, 0x66, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x6c, 0x00, 0x02, 0x02, 0x7e, 0x00, 0x09, + 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, 0xc8, 0x04, 0xc9, + 0x04, 0xda, 0x00, 0x02, 0x02, 0x76, 0x00, 0x09, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, + 0x04, 0xce, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xdb, 0x00, 0x02, 0x02, 0x6e, 0x00, 0x09, + 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, + 0x04, 0xdc, 0x00, 0x02, 0x00, 0xf0, 0x00, 0x0a, 0x01, 0x78, 0x01, 0x79, 0x01, 0x77, 0x01, 0x76, + 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x4c, 0x00, 0x01, 0x00, 0x01, 0x02, 0xe4, 0x00, 0x02, 0x00, 0x03, 0x00, 0x13, 0x00, 0x1c, + 0x00, 0x00, 0x01, 0x76, 0x01, 0x7f, 0x00, 0x0a, 0x01, 0xae, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x44, 0x00, 0x52, 0x00, 0x02, 0x00, 0x05, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x0a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0c, 0x01, 0x6f, 0x01, 0x75, + 0x00, 0x0d, 0x01, 0xae, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x02, 0x00, 0x05, 0x00, 0x13, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x0a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0c, 0x01, 0x6f, + 0x01, 0x7f, 0x00, 0x0d, 0x01, 0xb8, 0x01, 0xc1, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x05, 0x00, 0x13, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x0a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0c, + 0x01, 0x6f, 0x01, 0x7f, 0x00, 0x0d, 0x01, 0xae, 0x01, 0xb7, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x12, 0x01, 0xa0, 0x00, 0x02, 0x00, 0x07, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x8d, + 0x00, 0x8e, 0x00, 0x08, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0a, 0x01, 0x70, 0x01, 0x74, 0x00, 0x0b, + 0x01, 0x77, 0x01, 0x7e, 0x00, 0x10, 0x01, 0xaf, 0x01, 0xb6, 0x00, 0x18, 0x01, 0xb9, 0x01, 0xc0, + 0x00, 0x20, 0x00, 0x02, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x00, 0x01, 0x76, 0x01, 0x7f, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x94, + 0x00, 0x02, 0x01, 0x6f, 0x01, 0x75, 0x00, 0x03, 0x00, 0x01, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x0c, + 0x00, 0x10, 0x00, 0x12, 0x00, 0x23, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x5e, 0x00, 0x60, + 0x00, 0x6c, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x78, 0x00, 0x7c, 0x00, 0x86, 0x00, 0x96, + 0x00, 0x9a, 0x01, 0x58, 0x01, 0x5d, 0x00, 0x01, 0x00, 0x7f, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, + 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, + 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, + 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x77, + 0x00, 0x79, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, + 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, + 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, + 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, + 0x00, 0xdc, 0x00, 0xde, 0x00, 0xe0, 0x00, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0x00, 0xe8, 0x00, 0xea, + 0x00, 0xec, 0x00, 0xee, 0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xf8, 0x00, 0xfa, + 0x00, 0xfc, 0x00, 0xfe, 0x01, 0x00, 0x01, 0x02, 0x01, 0x04, 0x01, 0x06, 0x01, 0x08, 0x01, 0x0a, + 0x01, 0x0d, 0x01, 0x0f, 0x01, 0x11, 0x01, 0x13, 0x01, 0x15, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1b, + 0x01, 0x1d, 0x01, 0x1f, 0x01, 0x21, 0x01, 0x23, 0x01, 0x25, 0x01, 0x27, 0x01, 0x29, 0x01, 0x2b, + 0x01, 0x2d, 0x01, 0x2f, 0x01, 0x31, 0x01, 0x33, 0x01, 0x35, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3b, + 0x01, 0x3d, 0x01, 0x3f, 0x01, 0x41, 0x01, 0x43, 0x01, 0x45, 0x01, 0x47, 0x01, 0x49, 0x01, 0x4b, + 0x01, 0x4d, 0x01, 0x4f, 0x01, 0x51, 0x01, 0x53, 0x01, 0x55, 0x01, 0x57, 0x01, 0x5a, 0x01, 0x5c, + 0x01, 0x67, 0x01, 0x69, 0x01, 0x6b, 0x01, 0x6d, 0x00, 0x02, 0x00, 0x02, 0x04, 0x53, 0x04, 0x5a, + 0x00, 0x00, 0x04, 0x86, 0x04, 0x86, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x04, 0x63, 0x04, 0x6a, + 0x00, 0x00, 0x04, 0x95, 0x04, 0x95, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x04, 0x73, 0x04, 0x7a, + 0x00, 0x00, 0x04, 0xbf, 0x04, 0xbf, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x19, 0x1a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x12, 0x30, 0x82, 0x19, 0x0e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x18, 0xff, 0x30, 0x82, 0x18, 0xfb, 0x02, 0x01, 0x01, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x30, 0x61, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xa0, 0x53, 0x30, 0x51, 0x30, 0x2c, 0x06, + 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x1c, 0xa2, 0x1e, 0x80, 0x1c, 0x00, + 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, + 0x65, 0x00, 0x74, 0x00, 0x65, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x21, 0x30, 0x09, 0x06, + 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x00, 0x8a, 0x3b, 0xb1, 0xaa, 0x92, + 0x68, 0xb3, 0xa5, 0x2c, 0x13, 0x77, 0x35, 0xa6, 0x42, 0xdb, 0xf5, 0x52, 0x22, 0xa8, 0xa0, 0x82, + 0x13, 0x82, 0x30, 0x82, 0x05, 0x56, 0x30, 0x82, 0x04, 0x3e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x02, 0x20, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x30, 0x81, 0xcf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, + 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, + 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, + 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, + 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x73, + 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x31, 0x36, 0x30, 0x34, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x35, 0x30, 0x33, 0x30, 0x37, + 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x35, 0x30, 0x33, 0x30, 0x37, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x30, 0x81, 0xc1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, + 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, + 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, + 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x26, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf2, 0xb3, 0x91, 0xa5, 0xba, 0xd7, 0xd6, + 0x49, 0x0d, 0xf6, 0x7d, 0xd6, 0xc2, 0x2d, 0x90, 0xce, 0xfb, 0xe9, 0x60, 0x5a, 0x1a, 0x63, 0x15, + 0x19, 0x9c, 0xb4, 0x30, 0xa0, 0x9b, 0xd4, 0x78, 0xea, 0x06, 0x43, 0x3b, 0xed, 0x9d, 0x23, 0x28, + 0x32, 0x26, 0x5f, 0x32, 0x25, 0xe8, 0x95, 0x85, 0x0d, 0x3e, 0x4f, 0x80, 0xb4, 0x20, 0xb0, 0x9c, + 0xa2, 0x5e, 0x3e, 0x51, 0x8f, 0xfa, 0x93, 0x2e, 0xbb, 0xb2, 0xca, 0xc6, 0x3b, 0x11, 0x02, 0x56, + 0x00, 0x20, 0x8b, 0x41, 0x29, 0x84, 0xb4, 0x2b, 0x35, 0x79, 0xfb, 0xb0, 0x69, 0x07, 0xf1, 0x88, + 0x5d, 0x72, 0xad, 0xc0, 0xe2, 0xcb, 0x45, 0x0e, 0x25, 0xaf, 0xc4, 0xb4, 0xc2, 0xd6, 0xac, 0x65, + 0xb4, 0x61, 0x1a, 0xe2, 0xdf, 0x2d, 0x12, 0x0c, 0x76, 0x97, 0x63, 0x19, 0x4c, 0x79, 0x3c, 0xbb, + 0x0c, 0x74, 0x66, 0xf5, 0x01, 0x19, 0x59, 0x50, 0xe2, 0x0d, 0x9b, 0x5f, 0x59, 0x24, 0xfa, 0x39, + 0x1f, 0x99, 0xd3, 0x89, 0x70, 0x55, 0x48, 0xa6, 0x99, 0xa6, 0x0b, 0xe0, 0x7b, 0xa6, 0x28, 0x20, + 0xe5, 0x8a, 0xcb, 0x5d, 0x92, 0xad, 0x50, 0x28, 0xff, 0x80, 0x20, 0xcc, 0x2a, 0x2f, 0xd3, 0xbf, + 0xf1, 0xb9, 0xab, 0x4a, 0x5e, 0x3d, 0x97, 0x7a, 0x75, 0x08, 0xa1, 0x15, 0x99, 0x02, 0x5f, 0x5e, + 0xed, 0xcc, 0xa7, 0x40, 0xd6, 0x81, 0x55, 0x5d, 0xe8, 0x45, 0x27, 0xee, 0xbb, 0xff, 0x9d, 0xf8, + 0x18, 0xc2, 0x80, 0xf5, 0xb7, 0xec, 0x74, 0xb0, 0xce, 0xc2, 0x3f, 0x3e, 0x33, 0xf7, 0xef, 0xc1, + 0x1c, 0x0b, 0xd5, 0x48, 0xc9, 0x65, 0x32, 0x37, 0x6d, 0x0b, 0x55, 0xc9, 0x55, 0x4f, 0xcd, 0x22, + 0x1c, 0xbf, 0x9f, 0xf1, 0x94, 0x2f, 0x2b, 0xab, 0xa0, 0xa8, 0x30, 0x74, 0x43, 0x2c, 0xe7, 0x8a, + 0x4b, 0x20, 0x0d, 0x22, 0xab, 0x40, 0x78, 0x51, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, + 0x01, 0x46, 0x30, 0x82, 0x01, 0x42, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x06, 0xc0, 0x30, 0x16, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x01, 0x01, 0xff, 0x04, 0x0c, + 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xca, 0x23, 0xa3, 0x20, 0xb4, 0xb1, 0x6b, 0x72, 0x9f, + 0xba, 0x6f, 0x9a, 0x83, 0x3e, 0x0b, 0xc9, 0xd8, 0xb1, 0xd8, 0xa7, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb4, 0xc6, 0x7f, 0x1a, 0x43, 0xcc, 0x9b, 0x75, + 0x5d, 0x2f, 0xc4, 0x4b, 0xf2, 0x8b, 0x98, 0x10, 0xe9, 0xf1, 0x51, 0x10, 0x30, 0x3a, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x2e, 0x30, 0x2c, 0x30, 0x2a, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x1e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, + 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x39, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, + 0x32, 0x30, 0x30, 0x30, 0x2e, 0xa0, 0x2c, 0xa0, 0x2a, 0x86, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, + 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x66, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x63, 0x72, 0x6c, 0x30, 0x53, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x4c, 0x30, 0x4a, 0x30, 0x48, + 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd, 0x6e, 0x01, 0x07, 0x18, 0x02, 0x30, 0x39, 0x30, + 0x37, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x2b, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x18, 0x53, 0x7e, 0x74, + 0xac, 0xa7, 0x7a, 0xa3, 0x2b, 0xea, 0x78, 0x59, 0xd2, 0x3c, 0xc2, 0xf9, 0xc2, 0xf7, 0x25, 0x5f, + 0x42, 0x37, 0x5b, 0x3c, 0x11, 0x61, 0x1c, 0xa6, 0x03, 0xff, 0x34, 0x6a, 0x68, 0xbe, 0xda, 0x22, + 0xa4, 0x21, 0x5a, 0x48, 0x85, 0x90, 0x55, 0x4d, 0xce, 0xab, 0xa6, 0xcb, 0x34, 0xc6, 0xc0, 0xc6, + 0xad, 0xba, 0xb6, 0x80, 0xbe, 0x0b, 0x79, 0xc0, 0xa7, 0xe4, 0xda, 0xa7, 0x1a, 0xe7, 0xcf, 0x57, + 0x1e, 0xc8, 0x39, 0xf9, 0xef, 0xdf, 0x30, 0x30, 0xd0, 0xa0, 0x2a, 0xaf, 0x5c, 0x8d, 0x25, 0x53, + 0x2d, 0x4c, 0xf7, 0xf5, 0x6d, 0xb4, 0x7b, 0x72, 0xae, 0x52, 0xa3, 0xb7, 0xb9, 0xea, 0x55, 0x83, + 0x3e, 0x3a, 0x45, 0x4b, 0x94, 0x1a, 0x96, 0x64, 0x16, 0xd6, 0xe8, 0x60, 0xe3, 0xaf, 0x35, 0x8d, + 0x54, 0x25, 0x4c, 0x5b, 0xf8, 0xd6, 0x37, 0xd9, 0x04, 0xab, 0xb8, 0x36, 0xe0, 0x4a, 0x89, 0xfb, + 0x0a, 0x69, 0x6f, 0xcc, 0x57, 0xe1, 0xea, 0xdc, 0x22, 0xb2, 0xb5, 0xc5, 0x41, 0x1e, 0xd7, 0x63, + 0xe9, 0x9e, 0x64, 0xac, 0xb2, 0xc3, 0xc7, 0xbe, 0xda, 0x77, 0xe0, 0x58, 0x9d, 0x36, 0x01, 0x99, + 0xae, 0x86, 0x17, 0x66, 0x38, 0x1d, 0xbd, 0x64, 0xf6, 0xc6, 0x52, 0x5e, 0x10, 0x2f, 0x60, 0xd0, + 0xca, 0xcb, 0xc3, 0xc4, 0x72, 0x6f, 0x36, 0x85, 0x44, 0x22, 0x40, 0x9c, 0xc5, 0x41, 0x54, 0x33, + 0x23, 0x6c, 0x7b, 0xa3, 0x8e, 0xd9, 0x58, 0x85, 0xf1, 0xaa, 0xb8, 0x34, 0x7e, 0xbb, 0xb5, 0xae, + 0x68, 0x54, 0x78, 0x20, 0x0c, 0x52, 0x93, 0x4d, 0xb2, 0x4b, 0x01, 0xf2, 0xc1, 0x88, 0x47, 0x95, + 0xcd, 0x6c, 0xd2, 0x53, 0xa8, 0x4c, 0xf0, 0x18, 0x3e, 0x8c, 0x33, 0xa3, 0xc4, 0x8a, 0xcf, 0xce, + 0x73, 0x92, 0x49, 0x22, 0x8f, 0xed, 0xbb, 0xc8, 0x9c, 0x7c, 0x63, 0xab, 0x30, 0x82, 0x04, 0x00, + 0x30, 0x82, 0x02, 0xe8, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x63, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, + 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, + 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, + 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x30, 0x36, 0x32, 0x30, + 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x30, 0x36, 0x32, 0x30, 0x5a, + 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, + 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, + 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, + 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xde, 0x9d, 0xd7, 0xea, 0x57, 0x18, 0x49, 0xa1, 0x5b, 0xeb, + 0xd7, 0x5f, 0x48, 0x86, 0xea, 0xbe, 0xdd, 0xff, 0xe4, 0xef, 0x67, 0x1c, 0xf4, 0x65, 0x68, 0xb3, + 0x57, 0x71, 0xa0, 0x5e, 0x77, 0xbb, 0xed, 0x9b, 0x49, 0xe9, 0x70, 0x80, 0x3d, 0x56, 0x18, 0x63, + 0x08, 0x6f, 0xda, 0xf2, 0xcc, 0xd0, 0x3f, 0x7f, 0x02, 0x54, 0x22, 0x54, 0x10, 0xd8, 0xb2, 0x81, + 0xd4, 0xc0, 0x75, 0x3d, 0x4b, 0x7f, 0xc7, 0x77, 0xc3, 0x3e, 0x78, 0xab, 0x1a, 0x03, 0xb5, 0x20, + 0x6b, 0x2f, 0x6a, 0x2b, 0xb1, 0xc5, 0x88, 0x7e, 0xc4, 0xbb, 0x1e, 0xb0, 0xc1, 0xd8, 0x45, 0x27, + 0x6f, 0xaa, 0x37, 0x58, 0xf7, 0x87, 0x26, 0xd7, 0xd8, 0x2d, 0xf6, 0xa9, 0x17, 0xb7, 0x1f, 0x72, + 0x36, 0x4e, 0xa6, 0x17, 0x3f, 0x65, 0x98, 0x92, 0xdb, 0x2a, 0x6e, 0x5d, 0xa2, 0xfe, 0x88, 0xe0, + 0x0b, 0xde, 0x7f, 0xe5, 0x8d, 0x15, 0xe1, 0xeb, 0xcb, 0x3a, 0xd5, 0xe2, 0x12, 0xa2, 0x13, 0x2d, + 0xd8, 0x8e, 0xaf, 0x5f, 0x12, 0x3d, 0xa0, 0x08, 0x05, 0x08, 0xb6, 0x5c, 0xa5, 0x65, 0x38, 0x04, + 0x45, 0x99, 0x1e, 0xa3, 0x60, 0x60, 0x74, 0xc5, 0x41, 0xa5, 0x72, 0x62, 0x1b, 0x62, 0xc5, 0x1f, + 0x6f, 0x5f, 0x1a, 0x42, 0xbe, 0x02, 0x51, 0x65, 0xa8, 0xae, 0x23, 0x18, 0x6a, 0xfc, 0x78, 0x03, + 0xa9, 0x4d, 0x7f, 0x80, 0xc3, 0xfa, 0xab, 0x5a, 0xfc, 0xa1, 0x40, 0xa4, 0xca, 0x19, 0x16, 0xfe, + 0xb2, 0xc8, 0xef, 0x5e, 0x73, 0x0d, 0xee, 0x77, 0xbd, 0x9a, 0xf6, 0x79, 0x98, 0xbc, 0xb1, 0x07, + 0x67, 0xa2, 0x15, 0x0d, 0xdd, 0xa0, 0x58, 0xc6, 0x44, 0x7b, 0x0a, 0x3e, 0x62, 0x28, 0x5f, 0xba, + 0x41, 0x07, 0x53, 0x58, 0xcf, 0x11, 0x7e, 0x38, 0x74, 0xc5, 0xf8, 0xff, 0xb5, 0x69, 0x90, 0x8f, + 0x84, 0x74, 0xea, 0x97, 0x1b, 0xaf, 0x02, 0x01, 0x03, 0xa3, 0x81, 0xc0, 0x30, 0x81, 0xbd, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd2, 0xc4, 0xb0, 0xd2, 0x91, 0xd4, + 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, 0x30, 0x81, + 0x8d, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x85, 0x30, 0x81, 0x82, 0x80, 0x14, 0xd2, 0xc4, + 0xb0, 0xd2, 0x91, 0xd4, 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, + 0xd4, 0xe3, 0xa1, 0x67, 0xa4, 0x65, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, + 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, 0x01, 0x00, 0x30, 0x0c, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x32, 0x4b, 0xf3, 0xb2, 0xca, 0x3e, 0x91, 0xfc, 0x12, 0xc6, 0xa1, 0x07, 0x8c, 0x8e, 0x77, 0xa0, + 0x33, 0x06, 0x14, 0x5c, 0x90, 0x1e, 0x18, 0xf7, 0x08, 0xa6, 0x3d, 0x0a, 0x19, 0xf9, 0x87, 0x80, + 0x11, 0x6e, 0x69, 0xe4, 0x96, 0x17, 0x30, 0xff, 0x34, 0x91, 0x63, 0x72, 0x38, 0xee, 0xcc, 0x1c, + 0x01, 0xa3, 0x1d, 0x94, 0x28, 0xa4, 0x31, 0xf6, 0x7a, 0xc4, 0x54, 0xd7, 0xf6, 0xe5, 0x31, 0x58, + 0x03, 0xa2, 0xcc, 0xce, 0x62, 0xdb, 0x94, 0x45, 0x73, 0xb5, 0xbf, 0x45, 0xc9, 0x24, 0xb5, 0xd5, + 0x82, 0x02, 0xad, 0x23, 0x79, 0x69, 0x8d, 0xb8, 0xb6, 0x4d, 0xce, 0xcf, 0x4c, 0xca, 0x33, 0x23, + 0xe8, 0x1c, 0x88, 0xaa, 0x9d, 0x8b, 0x41, 0x6e, 0x16, 0xc9, 0x20, 0xe5, 0x89, 0x9e, 0xcd, 0x3b, + 0xda, 0x70, 0xf7, 0x7e, 0x99, 0x26, 0x20, 0x14, 0x54, 0x25, 0xab, 0x6e, 0x73, 0x85, 0xe6, 0x9b, + 0x21, 0x9d, 0x0a, 0x6c, 0x82, 0x0e, 0xa8, 0xf8, 0xc2, 0x0c, 0xfa, 0x10, 0x1e, 0x6c, 0x96, 0xef, + 0x87, 0x0d, 0xc4, 0x0f, 0x61, 0x8b, 0xad, 0xee, 0x83, 0x2b, 0x95, 0xf8, 0x8e, 0x92, 0x84, 0x72, + 0x39, 0xeb, 0x20, 0xea, 0x83, 0xed, 0x83, 0xcd, 0x97, 0x6e, 0x08, 0xbc, 0xeb, 0x4e, 0x26, 0xb6, + 0x73, 0x2b, 0xe4, 0xd3, 0xf6, 0x4c, 0xfe, 0x26, 0x71, 0xe2, 0x61, 0x11, 0x74, 0x4a, 0xff, 0x57, + 0x1a, 0x87, 0x0f, 0x75, 0x48, 0x2e, 0xcf, 0x51, 0x69, 0x17, 0xa0, 0x02, 0x12, 0x61, 0x95, 0xd5, + 0xd1, 0x40, 0xb2, 0x10, 0x4c, 0xee, 0xc4, 0xac, 0x10, 0x43, 0xa6, 0xa5, 0x9e, 0x0a, 0xd5, 0x95, + 0x62, 0x9a, 0x0d, 0xcf, 0x88, 0x82, 0xc5, 0x32, 0x0c, 0xe4, 0x2b, 0x9f, 0x45, 0xe6, 0x0d, 0x9f, + 0x28, 0x9c, 0xb1, 0xb9, 0x2a, 0x5a, 0x57, 0xad, 0x37, 0x0f, 0xaf, 0x1d, 0x7f, 0xdb, 0xbd, 0x9f, + 0x30, 0x82, 0x04, 0xde, 0x30, 0x82, 0x03, 0xc6, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, + 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, + 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, + 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x36, 0x30, + 0x31, 0x35, 0x34, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x31, 0x36, 0x30, 0x31, + 0x35, 0x34, 0x33, 0x37, 0x5a, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, + 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, + 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, + 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, + 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, + 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32, + 0x38, 0x37, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xc4, 0x2d, 0xd5, 0x15, 0x8c, 0x9c, 0x26, 0x4c, 0xec, 0x32, 0x35, 0xeb, 0x5f, + 0xb8, 0x59, 0x01, 0x5a, 0xa6, 0x61, 0x81, 0x59, 0x3b, 0x70, 0x63, 0xab, 0xe3, 0xdc, 0x3d, 0xc7, + 0x2a, 0xb8, 0xc9, 0x33, 0xd3, 0x79, 0xe4, 0x3a, 0xed, 0x3c, 0x30, 0x23, 0x84, 0x8e, 0xb3, 0x30, + 0x14, 0xb6, 0xb2, 0x87, 0xc3, 0x3d, 0x95, 0x54, 0x04, 0x9e, 0xdf, 0x99, 0xdd, 0x0b, 0x25, 0x1e, + 0x21, 0xde, 0x65, 0x29, 0x7e, 0x35, 0xa8, 0xa9, 0x54, 0xeb, 0xf6, 0xf7, 0x32, 0x39, 0xd4, 0x26, + 0x55, 0x95, 0xad, 0xef, 0xfb, 0xfe, 0x58, 0x86, 0xd7, 0x9e, 0xf4, 0x00, 0x8d, 0x8c, 0x2a, 0x0c, + 0xbd, 0x42, 0x04, 0xce, 0xa7, 0x3f, 0x04, 0xf6, 0xee, 0x80, 0xf2, 0xaa, 0xef, 0x52, 0xa1, 0x69, + 0x66, 0xda, 0xbe, 0x1a, 0xad, 0x5d, 0xda, 0x2c, 0x66, 0xea, 0x1a, 0x6b, 0xbb, 0xe5, 0x1a, 0x51, + 0x4a, 0x00, 0x2f, 0x48, 0xc7, 0x98, 0x75, 0xd8, 0xb9, 0x29, 0xc8, 0xee, 0xf8, 0x66, 0x6d, 0x0a, + 0x9c, 0xb3, 0xf3, 0xfc, 0x78, 0x7c, 0xa2, 0xf8, 0xa3, 0xf2, 0xb5, 0xc3, 0xf3, 0xb9, 0x7a, 0x91, + 0xc1, 0xa7, 0xe6, 0x25, 0x2e, 0x9c, 0xa8, 0xed, 0x12, 0x65, 0x6e, 0x6a, 0xf6, 0x12, 0x44, 0x53, + 0x70, 0x30, 0x95, 0xc3, 0x9c, 0x2b, 0x58, 0x2b, 0x3d, 0x08, 0x74, 0x4a, 0xf2, 0xbe, 0x51, 0xb0, + 0xbf, 0x87, 0xd0, 0x4c, 0x27, 0x58, 0x6b, 0xb5, 0x35, 0xc5, 0x9d, 0xaf, 0x17, 0x31, 0xf8, 0x0b, + 0x8f, 0xee, 0xad, 0x81, 0x36, 0x05, 0x89, 0x08, 0x98, 0xcf, 0x3a, 0xaf, 0x25, 0x87, 0xc0, 0x49, + 0xea, 0xa7, 0xfd, 0x67, 0xf7, 0x45, 0x8e, 0x97, 0xcc, 0x14, 0x39, 0xe2, 0x36, 0x85, 0xb5, 0x7e, + 0x1a, 0x37, 0xfd, 0x16, 0xf6, 0x71, 0x11, 0x9a, 0x74, 0x30, 0x16, 0xfe, 0x13, 0x94, 0xa3, 0x3f, + 0x84, 0x0d, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x32, 0x30, 0x82, 0x01, 0x2e, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfd, 0xac, 0x61, 0x32, 0x93, + 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76, 0x99, 0x68, 0xcc, 0xe7, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd2, 0xc4, 0xb0, 0xd2, + 0x91, 0xd4, 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, + 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, + 0xff, 0x02, 0x01, 0x00, 0x30, 0x33, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, + 0x04, 0x27, 0x30, 0x25, 0x30, 0x23, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, + 0x86, 0x17, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, + 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x46, 0x06, 0x03, 0x55, 0x1d, 0x1f, + 0x04, 0x3f, 0x30, 0x3d, 0x30, 0x3b, 0xa0, 0x39, 0xa0, 0x37, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, + 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x4b, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x44, 0x30, 0x42, 0x30, 0x40, 0x06, 0x04, + 0x55, 0x1d, 0x20, 0x00, 0x30, 0x38, 0x30, 0x36, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x02, 0x01, 0x16, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0xd2, 0x86, 0xc0, 0xec, 0xbd, 0xf9, 0xa1, 0xb6, 0x67, 0xee, 0x66, 0x0b, 0xa2, 0x06, + 0x3a, 0x04, 0x50, 0x8e, 0x15, 0x72, 0xac, 0x4a, 0x74, 0x95, 0x53, 0xcb, 0x37, 0xcb, 0x44, 0x49, + 0xef, 0x07, 0x90, 0x6b, 0x33, 0xd9, 0x96, 0xf0, 0x94, 0x56, 0xa5, 0x13, 0x30, 0x05, 0x3c, 0x85, + 0x32, 0x21, 0x7b, 0xc9, 0xc7, 0x0a, 0xa8, 0x24, 0xa4, 0x90, 0xde, 0x46, 0xd3, 0x25, 0x23, 0x14, + 0x03, 0x67, 0xc2, 0x10, 0xd6, 0x6f, 0x0f, 0x5d, 0x7b, 0x7a, 0xcc, 0x9f, 0xc5, 0x58, 0x2a, 0xc1, + 0xc4, 0x9e, 0x21, 0xa8, 0x5a, 0xf3, 0xac, 0xa4, 0x46, 0xf3, 0x9e, 0xe4, 0x63, 0xcb, 0x2f, 0x90, + 0xa4, 0x29, 0x29, 0x01, 0xd9, 0x72, 0x2c, 0x29, 0xdf, 0x37, 0x01, 0x27, 0xbc, 0x4f, 0xee, 0x68, + 0xd3, 0x21, 0x8f, 0xc0, 0xb3, 0xe4, 0xf5, 0x09, 0xed, 0xd2, 0x10, 0xaa, 0x53, 0xb4, 0xbe, 0xf0, + 0xcc, 0x59, 0x0b, 0xd6, 0x3b, 0x96, 0x1c, 0x95, 0x24, 0x49, 0xdf, 0xce, 0xec, 0xfd, 0xa7, 0x48, + 0x91, 0x14, 0x45, 0x0e, 0x3a, 0x36, 0x6f, 0xda, 0x45, 0xb3, 0x45, 0xa2, 0x41, 0xc9, 0xd4, 0xd7, + 0x44, 0x4e, 0x3e, 0xb9, 0x74, 0x76, 0xd5, 0xa2, 0x13, 0x55, 0x2c, 0xc6, 0x87, 0xa3, 0xb5, 0x99, + 0xac, 0x06, 0x84, 0x87, 0x7f, 0x75, 0x06, 0xfc, 0xbf, 0x14, 0x4c, 0x0e, 0xcc, 0x6e, 0xc4, 0xdf, + 0x3d, 0xb7, 0x12, 0x71, 0xf4, 0xe8, 0xf1, 0x51, 0x40, 0x22, 0x28, 0x49, 0xe0, 0x1d, 0x4b, 0x87, + 0xa8, 0x34, 0xcc, 0x06, 0xa2, 0xdd, 0x12, 0x5a, 0xd1, 0x86, 0x36, 0x64, 0x03, 0x35, 0x6f, 0x6f, + 0x77, 0x6e, 0xeb, 0xf2, 0x85, 0x50, 0x98, 0x5e, 0xab, 0x03, 0x53, 0xad, 0x91, 0x23, 0x63, 0x1f, + 0x16, 0x9c, 0xcd, 0xb9, 0xb2, 0x05, 0x63, 0x3a, 0xe1, 0xf4, 0x68, 0x1b, 0x17, 0x05, 0x35, 0x95, + 0x53, 0xee, 0x30, 0x82, 0x05, 0x3e, 0x30, 0x82, 0x04, 0x26, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x06, 0x0b, 0xef, 0xf4, 0xbf, 0x69, 0x7b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, + 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, + 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, + 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, + 0x79, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, + 0x32, 0x38, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x32, 0x34, 0x31, 0x33, 0x34, + 0x34, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x39, 0x32, 0x34, 0x31, 0x33, 0x34, 0x34, + 0x32, 0x33, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x47, 0x42, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x06, 0x4c, 0x6f, 0x6e, + 0x64, 0x6f, 0x6e, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x4c, 0x6f, + 0x6e, 0x64, 0x6f, 0x6e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x44, + 0x61, 0x6c, 0x74, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x61, 0x67, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x64, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x44, 0x61, 0x6c, + 0x74, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x61, 0x67, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xa2, 0x04, 0x5f, 0xe6, 0xd8, 0xdb, 0xd2, 0xa1, 0xa2, 0xf3, 0x7e, 0xc5, 0x34, 0xe7, 0x72, + 0xd8, 0xae, 0xfb, 0x95, 0xcf, 0xec, 0xa4, 0xea, 0x0e, 0x1d, 0x00, 0x07, 0x92, 0xdb, 0x16, 0xf6, + 0xac, 0x53, 0x1f, 0x35, 0xf1, 0x94, 0x01, 0x9c, 0xa3, 0x8e, 0x90, 0x99, 0x08, 0x46, 0xe0, 0x05, + 0x0f, 0x2b, 0x91, 0xb6, 0xa6, 0xff, 0x0b, 0x1b, 0x0c, 0xba, 0x2b, 0x46, 0x6e, 0x62, 0xe6, 0x89, + 0xa7, 0x0b, 0x41, 0xf5, 0x14, 0xe6, 0xc0, 0xea, 0x6b, 0x55, 0x72, 0x11, 0x5d, 0x8e, 0xcf, 0xdc, + 0x58, 0x33, 0x89, 0xff, 0xe5, 0x90, 0x75, 0xdc, 0xc3, 0xcc, 0x2d, 0x60, 0x3e, 0xd6, 0x03, 0xe9, + 0xa9, 0xc6, 0x54, 0x3e, 0x94, 0xbc, 0xec, 0x8a, 0x91, 0x36, 0x7a, 0xed, 0x55, 0xfd, 0xd8, 0x3d, + 0x6b, 0x27, 0x46, 0x09, 0x5f, 0xd4, 0xdb, 0xc1, 0x5f, 0xa2, 0xf7, 0x88, 0xe4, 0x88, 0x7e, 0xfa, + 0xe3, 0x82, 0xe0, 0x2f, 0x42, 0x62, 0x51, 0x46, 0xbb, 0xc6, 0x30, 0x71, 0x7b, 0xb2, 0xcc, 0x8c, + 0x33, 0x76, 0xed, 0xe0, 0xb5, 0x99, 0xad, 0xc3, 0x1d, 0x0d, 0xe3, 0x88, 0x77, 0x78, 0x31, 0x3c, + 0x54, 0x52, 0x15, 0x6c, 0xde, 0xdc, 0xcc, 0x70, 0x97, 0x1c, 0x9b, 0x85, 0xf4, 0x38, 0xf7, 0x05, + 0x47, 0x4b, 0x27, 0xb0, 0x5d, 0xa3, 0x3c, 0x66, 0x22, 0xa5, 0x28, 0x97, 0x0a, 0x76, 0x94, 0x67, + 0xc1, 0xbb, 0x8f, 0x9f, 0x1a, 0xf0, 0x06, 0x7c, 0x80, 0x91, 0x58, 0x1a, 0x75, 0x20, 0x20, 0x06, + 0x94, 0x5a, 0x0b, 0x71, 0xef, 0x26, 0xed, 0xf2, 0x5e, 0x82, 0xd3, 0x9a, 0x0b, 0xe6, 0x93, 0xb7, + 0x07, 0x16, 0x41, 0xea, 0x62, 0xd5, 0xd4, 0xd2, 0x8c, 0x93, 0xaa, 0xf8, 0xc1, 0x34, 0xd7, 0x8a, + 0xfb, 0x8d, 0x45, 0x4c, 0x6e, 0x6f, 0x8c, 0x7c, 0xaf, 0x01, 0x8d, 0x66, 0xf4, 0x31, 0xeb, 0xae, + 0x1d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x86, 0x30, 0x82, 0x01, 0x82, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0x00, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x03, 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x07, 0x80, 0x30, 0x32, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2b, 0x30, 0x29, 0x30, + 0x27, 0xa0, 0x25, 0xa0, 0x23, 0x86, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x6c, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x64, + 0x73, 0x32, 0x2d, 0x30, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x53, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, + 0x4c, 0x30, 0x4a, 0x30, 0x48, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd, 0x6d, 0x01, 0x07, + 0x17, 0x02, 0x30, 0x39, 0x30, 0x37, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, + 0x16, 0x2b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x30, 0x81, 0x80, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x74, 0x30, 0x72, 0x30, 0x24, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, + 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x72, 0x74, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, + 0x32, 0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76, 0x99, 0x68, 0xcc, + 0xe7, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x68, 0x66, 0x30, 0x10, + 0x67, 0x55, 0xa1, 0xb3, 0xa1, 0xe9, 0x37, 0xc6, 0x75, 0x11, 0x89, 0x33, 0xe3, 0x85, 0xd7, 0x13, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0xbd, 0x56, 0x3e, 0x09, 0xb4, 0x13, 0x7d, 0xfa, 0xed, 0xd3, 0xfe, 0x45, + 0xb6, 0xdf, 0xdf, 0x19, 0x48, 0xf8, 0xa3, 0x8c, 0xd5, 0x11, 0x54, 0x8f, 0xd4, 0x92, 0x44, 0x13, + 0xc1, 0x71, 0x69, 0xa3, 0xc3, 0x30, 0x06, 0x80, 0x1d, 0xda, 0x37, 0xae, 0xca, 0x47, 0x68, 0xd9, + 0xb3, 0x25, 0x09, 0x36, 0x0c, 0xe9, 0x04, 0x3b, 0xe2, 0xdb, 0x51, 0x10, 0x74, 0xfe, 0x10, 0x5e, + 0xc9, 0xde, 0x3b, 0x0f, 0x24, 0x03, 0xb1, 0x9e, 0x39, 0x96, 0xc3, 0xa0, 0x0f, 0x4c, 0x52, 0xca, + 0xe7, 0x42, 0x66, 0x11, 0x5a, 0x75, 0x68, 0x49, 0x3a, 0x2d, 0x23, 0x6b, 0x5e, 0x06, 0xc4, 0x43, + 0xf1, 0x9e, 0x01, 0xb1, 0x2f, 0x0b, 0xa5, 0x9c, 0x12, 0x1e, 0x3e, 0x3d, 0x18, 0x6e, 0x5a, 0xb0, + 0x95, 0x74, 0x3f, 0x2e, 0x4b, 0xe1, 0x30, 0x6d, 0x73, 0xc3, 0x9e, 0x6f, 0xaf, 0xe3, 0x0f, 0x47, + 0xfa, 0xdd, 0x24, 0x60, 0x64, 0xa7, 0x5c, 0x63, 0x00, 0xdd, 0xa9, 0xb7, 0x50, 0x34, 0x65, 0xc7, + 0x28, 0x05, 0x49, 0xfe, 0x5a, 0x7a, 0x18, 0xea, 0x1c, 0xc0, 0x46, 0xb6, 0x9a, 0x2a, 0xd9, 0x81, + 0x65, 0xb2, 0x91, 0xca, 0x0c, 0xd6, 0x7b, 0x88, 0xf0, 0xea, 0x3e, 0xe9, 0x18, 0x55, 0x30, 0x87, + 0xcf, 0xaf, 0x91, 0xa8, 0x1e, 0x23, 0x08, 0x6b, 0x45, 0x90, 0x99, 0x06, 0xdc, 0x91, 0x37, 0x0d, + 0xbf, 0xd4, 0xdd, 0x66, 0x5f, 0x55, 0x00, 0xf4, 0xf1, 0xe3, 0xed, 0x60, 0x34, 0x95, 0x3e, 0x97, + 0xa2, 0xc2, 0xca, 0x6a, 0x8d, 0x61, 0x40, 0x30, 0x91, 0xc4, 0xa5, 0x01, 0x06, 0x5b, 0xd0, 0x60, + 0x6d, 0x4f, 0x34, 0x1f, 0x7e, 0x9d, 0x09, 0x31, 0x53, 0xe5, 0xe9, 0x78, 0x96, 0xd0, 0x83, 0xc4, + 0xaa, 0xbd, 0xe5, 0x62, 0xaa, 0x32, 0x1c, 0x22, 0x23, 0x4e, 0x12, 0x2e, 0x7c, 0x08, 0xb6, 0x9f, + 0xdf, 0x5c, 0x23, 0x96, 0x31, 0x82, 0x04, 0xfe, 0x30, 0x82, 0x04, 0xfa, 0x02, 0x01, 0x01, 0x30, + 0x81, 0xd5, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, + 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, + 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, + 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32, 0x38, 0x37, 0x02, + 0x06, 0x0b, 0xef, 0xf4, 0xbf, 0x69, 0x7b, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, + 0x05, 0x00, 0xa0, 0x81, 0x86, 0x30, 0x10, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x0c, 0x31, 0x02, 0x30, 0x00, 0x30, 0x14, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, + 0x82, 0x37, 0x28, 0x01, 0x31, 0x07, 0x03, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x19, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, + 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0x82, 0x37, 0x02, 0x01, 0x0b, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0x82, 0x37, 0x02, 0x01, 0x15, 0x30, 0x23, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x04, 0x31, 0x16, 0x04, 0x14, 0x56, 0xf8, 0xd0, 0xcb, 0x04, 0x98, 0xa9, 0x9a, 0xc2, + 0x61, 0x15, 0x65, 0x95, 0xa0, 0x7f, 0xc6, 0x0c, 0x9d, 0x15, 0xbd, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x1b, 0x1f, + 0x30, 0x16, 0x4c, 0x23, 0x8c, 0xca, 0x4b, 0xfc, 0x2d, 0xe8, 0x0f, 0x5b, 0x55, 0xf2, 0x7b, 0xbb, + 0x09, 0x45, 0x2d, 0x26, 0xef, 0x4e, 0xc4, 0x99, 0x30, 0x73, 0x75, 0xf7, 0xdd, 0x9b, 0xb4, 0x16, + 0x37, 0x33, 0x39, 0x11, 0x84, 0x05, 0x24, 0xdf, 0x8a, 0x5a, 0x12, 0x9b, 0x46, 0xd0, 0x48, 0x3a, + 0x65, 0x82, 0xb0, 0x93, 0x61, 0x5f, 0x77, 0xe3, 0xca, 0x1b, 0xec, 0xcb, 0x48, 0xc0, 0xd2, 0x57, + 0x17, 0x37, 0x89, 0x55, 0x57, 0x01, 0xee, 0xe8, 0x27, 0x39, 0x24, 0xf5, 0xfe, 0x3d, 0xfb, 0x2f, + 0x78, 0x60, 0xc2, 0xa8, 0x6f, 0x24, 0xf7, 0xf5, 0xd2, 0x40, 0x10, 0x4e, 0x8f, 0x43, 0xd3, 0xe8, + 0x3f, 0x7b, 0x48, 0xf1, 0xc8, 0x33, 0x8b, 0xd7, 0xaf, 0x2b, 0xda, 0x0f, 0x13, 0x5d, 0xd3, 0xec, + 0x32, 0xd9, 0xdc, 0x26, 0xdd, 0x86, 0x7e, 0x28, 0x32, 0xd1, 0xe3, 0x76, 0x2a, 0xd8, 0x99, 0x60, + 0xfe, 0x5b, 0xf5, 0xa8, 0x84, 0x86, 0x9a, 0x2e, 0x24, 0x4a, 0xff, 0xbb, 0x15, 0x8c, 0xf5, 0x1e, + 0x94, 0x1e, 0xdf, 0x6e, 0xee, 0x11, 0xae, 0xdb, 0x1f, 0x3d, 0xe9, 0x15, 0xfb, 0xd2, 0x60, 0xeb, + 0xb8, 0x1b, 0x72, 0x61, 0xe2, 0x6a, 0x1b, 0xe4, 0x3b, 0xd9, 0x5d, 0x40, 0xff, 0x3d, 0x06, 0xbb, + 0xcb, 0x10, 0x4d, 0xd6, 0xe4, 0x3e, 0x9a, 0x8d, 0x89, 0x51, 0xf3, 0x02, 0x0d, 0x2e, 0xf9, 0x9c, + 0xee, 0x5b, 0x9b, 0x64, 0x43, 0x51, 0x4e, 0x03, 0xf6, 0x9c, 0xbd, 0x46, 0x20, 0xe7, 0xdf, 0x0c, + 0x32, 0x80, 0xb6, 0x26, 0xad, 0xcb, 0x49, 0x23, 0x95, 0xcc, 0x88, 0xd0, 0x6c, 0xa4, 0xd3, 0x87, + 0x9f, 0xc5, 0xc7, 0x94, 0x51, 0x7e, 0x42, 0x35, 0x78, 0x54, 0x5e, 0x77, 0x78, 0x2e, 0xfd, 0xc0, + 0x0b, 0xb9, 0x80, 0x78, 0xd5, 0x82, 0xcf, 0xb4, 0x86, 0x8a, 0x65, 0x66, 0xb6, 0xd0, 0xa1, 0x82, + 0x02, 0x74, 0x30, 0x82, 0x02, 0x70, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x06, 0x31, 0x82, 0x02, 0x61, 0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x01, 0x30, 0x81, 0xd6, 0x30, + 0x81, 0xcf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, + 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, + 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3a, 0x30, + 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x2d, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x02, 0x02, 0x20, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0xa0, 0x5d, 0x30, 0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x03, 0x31, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, + 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, + 0x0d, 0x31, 0x31, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x34, 0x34, 0x32, 0x5a, 0x30, 0x23, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04, 0x31, 0x16, 0x04, 0x14, 0x3f, + 0xf3, 0x7d, 0x21, 0x51, 0xa4, 0x0b, 0x6b, 0x6e, 0x41, 0xee, 0x34, 0x06, 0x20, 0x46, 0x5a, 0x4e, + 0xe3, 0xe5, 0x1f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0xc4, 0xfb, 0x13, 0x49, 0x33, 0x78, 0xa8, 0x08, 0xad, 0x0c, + 0xc8, 0x9b, 0x7c, 0xa6, 0xfb, 0x1e, 0xd2, 0xe0, 0xc3, 0xdf, 0x40, 0xbc, 0x47, 0xe0, 0x64, 0x29, + 0x7e, 0x38, 0x55, 0x9c, 0xba, 0x86, 0x9e, 0xea, 0x2b, 0x89, 0x84, 0x64, 0x08, 0x8c, 0x77, 0x27, + 0xf1, 0xdd, 0x2c, 0x71, 0xca, 0xf2, 0x2e, 0x50, 0xbd, 0xa5, 0x16, 0xe2, 0x17, 0x3f, 0xd8, 0xfe, + 0x50, 0x62, 0xf9, 0x44, 0x7f, 0x71, 0x73, 0x9c, 0x65, 0xf8, 0x66, 0x3c, 0x7b, 0x0b, 0x00, 0xf3, + 0x9e, 0xd0, 0x5c, 0x07, 0xe8, 0x41, 0x9c, 0xaf, 0xc7, 0x69, 0x84, 0x1b, 0x9e, 0x4c, 0xb6, 0xad, + 0x46, 0x77, 0xc1, 0xd4, 0x09, 0x6a, 0xc6, 0x38, 0xe8, 0xa7, 0xcc, 0xc8, 0x9e, 0x6a, 0x91, 0x55, + 0x21, 0xe6, 0x17, 0xab, 0xb7, 0xc0, 0x70, 0xe8, 0xae, 0x6b, 0x4a, 0x64, 0xe2, 0xda, 0x53, 0x3b, + 0x7c, 0x01, 0xc2, 0xe4, 0x70, 0x57, 0x9f, 0xdc, 0x08, 0xc6, 0x7e, 0xd7, 0x66, 0x73, 0x2f, 0x6d, + 0xf8, 0x6e, 0x05, 0x09, 0x0a, 0xc3, 0x52, 0x1a, 0x69, 0x41, 0x68, 0x17, 0xc7, 0x29, 0x68, 0x8e, + 0xcc, 0x4f, 0xe6, 0x2e, 0x78, 0x49, 0x8b, 0x7d, 0xdf, 0x5c, 0x60, 0xd9, 0xca, 0x95, 0xfd, 0xb2, + 0x50, 0x13, 0xee, 0xc0, 0x9a, 0xa1, 0x61, 0x27, 0x87, 0xf8, 0x56, 0xb6, 0xb0, 0xc9, 0xe5, 0x31, + 0xb2, 0x3d, 0xcf, 0xbd, 0x46, 0xce, 0x7e, 0xd7, 0x67, 0x24, 0xe8, 0xe4, 0x41, 0xf6, 0x2b, 0x4b, + 0xee, 0xc5, 0x71, 0xe8, 0x44, 0xbf, 0x81, 0xf4, 0xbe, 0xf6, 0x59, 0xbe, 0x75, 0x71, 0x58, 0xf2, + 0xed, 0x96, 0x71, 0x6c, 0x6e, 0xc3, 0x0b, 0xce, 0xe1, 0x07, 0x61, 0xaa, 0x97, 0xa9, 0xf1, 0xe1, + 0x98, 0x63, 0x66, 0xc6, 0xac, 0xfa, 0xf6, 0x69, 0x22, 0x0c, 0x37, 0xe6, 0xa0, 0x60, 0xb8, 0xee, + 0xbc, 0xe5, 0x4e, 0xcb, 0xb3, 0x5a, 0x00, 0x00 +}; + +size_t ubuntu_font_size = sizeof(ubuntu_font); diff --git a/lib/lvgl/tests/unity/unity_support.c b/lib/lvgl/tests/unity/unity_support.c index 6906bd2..39aea99 100644 --- a/lib/lvgl/tests/unity/unity_support.c +++ b/lib/lvgl/tests/unity/unity_support.c @@ -28,6 +28,8 @@ *********************/ //#define REF_IMGS_PATH "lvgl/tests/lv_test_ref_imgs/" #define REF_IMGS_PATH "ref_imgs/" +#define ERR_FILE_NOT_FOUND -1 +#define ERR_PNG -2 /********************** * TYPEDEFS @@ -41,12 +43,13 @@ typedef struct { png_infop info_ptr; int number_of_passes; png_bytep * row_pointers; -}png_img_t; +} png_img_t; /********************** * STATIC PROTOTYPES **********************/ -static int read_png_file(png_img_t * p, const char* file_name); +static int read_png_file(png_img_t * p, const char * file_name); +static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name); static void png_release(png_img_t * p); /********************** @@ -63,95 +66,74 @@ static void png_release(png_img_t * p); bool lv_test_assert_img_eq(const char * fn_ref) { - char fn_ref_full[512]; - sprintf(fn_ref_full, "%s%s", REF_IMGS_PATH, fn_ref); - - png_img_t p; - int res = read_png_file(&p, fn_ref_full); - if(res < 0) return false; - uint8_t * screen_buf; - - lv_obj_invalidate(lv_scr_act()); - lv_refr_now(NULL); - - extern lv_color_t test_fb[]; - - screen_buf = (uint8_t *)test_fb; - - uint8_t * ptr_act = NULL; - const png_byte* ptr_ref = NULL; - - bool err = false; - int x, y, i_buf = 0; - for (y = 0; y < p.height; y++) { - png_byte* row = p.row_pointers[y]; - - for (x = 0; x < p.width; x++) { - ptr_ref = &(row[x*3]); - ptr_act = &(screen_buf[i_buf*4]); - - uint32_t ref_px = 0; - uint32_t act_px = 0; - memcpy(&ref_px, ptr_ref, 3); - memcpy(&act_px, ptr_act, 3); - //printf("0xFF%06x, ", act_px); - - uint8_t act_swap[3] = {ptr_act[2], ptr_act[1], ptr_act[0]}; - - if(memcmp(act_swap, ptr_ref, 3) != 0) { - err = true; - break; - } - i_buf++; - } - if(err) break; - } - - if(err) { - uint32_t ref_px = 0; - uint32_t act_px = 0; - memcpy(&ref_px, ptr_ref, 3); - memcpy(&act_px, ptr_act, 3); - - FILE * f = fopen("../test_screenshot_error.h", "w"); - - fprintf(f, "//Diff in %s at (%d;%d), %x instead of %x)\n\n", fn_ref, x, y, act_px, ref_px); - fprintf(f, "static const uint32_t test_screenshot_error_data[] = {\n"); - - i_buf = 0; - for (y = 0; y < 480; y++) { - fprintf(f, "\n"); - for (x = 0; x < 800; x++) { - ptr_act = &(screen_buf[i_buf * 4]); - act_px = 0; - memcpy(&act_px, ptr_act, 3); - fprintf(f, "0xFF%06X, ", act_px); - i_buf++; - } - } - fprintf(f, "};\n\n"); + char fn_ref_full[512]; + sprintf(fn_ref_full, "%s%s", REF_IMGS_PATH, fn_ref); + + uint8_t * screen_buf; + + lv_obj_invalidate(lv_scr_act()); + lv_refr_now(NULL); + + extern lv_color32_t test_fb[]; + + screen_buf = (uint8_t *)test_fb; + + png_img_t p; + int res = read_png_file(&p, fn_ref_full); + if(res == ERR_FILE_NOT_FOUND) { + TEST_PRINTF("%s%s", fn_ref_full, " was not found, creating is now from the rendered screen"); + fflush(stderr); + write_png_file(screen_buf, 800, 480, fn_ref_full); + + return true; + } + else if(res == ERR_PNG) { + return false; + } - fprintf(f, "static lv_img_dsc_t test_screenshot_error_dsc = { \n" - " .header.w = 800,\n" - " .header.h = 480,\n" - " .header.always_zero = 0,\n" - " .header.cf = LV_IMG_CF_TRUE_COLOR,\n" - " .data_size = 800 * 480 * 4,\n" - " .data = test_screenshot_error_data};\n\n" - "static inline void test_screenshot_error_show(void)\n" - "{\n" - " lv_obj_t * img = lv_img_create(lv_scr_act());\n" - " lv_img_set_src(img, &test_screenshot_error_dsc);\n" - "}\n"); + uint8_t * ptr_act = NULL; + const png_byte * ptr_ref = NULL; - fclose(f); + bool err = false; + int x, y, i_buf = 0; + for(y = 0; y < p.height; y++) { + png_byte * row = p.row_pointers[y]; - } + for(x = 0; x < p.width; x++) { + ptr_ref = &(row[x * 3]); + ptr_act = &(screen_buf[i_buf * 4]); + uint32_t ref_px = 0; + uint32_t act_px = 0; + memcpy(&ref_px, ptr_ref, 3); + memcpy(&act_px, ptr_act, 3); + //printf("0xFF%06x, ", act_px); + + uint8_t act_swap[3] = {ptr_act[2], ptr_act[1], ptr_act[0]}; + + if(memcmp(act_swap, ptr_ref, 3) != 0) { + err = true; + break; + } + i_buf++; + } + if(err) break; + } + + if(err) { + char fn_ref_no_ext[64]; + strcpy(fn_ref_no_ext, fn_ref); + fn_ref_no_ext[strlen(fn_ref_no_ext) - 4] = '\0'; + + char fn_err_full[512]; + sprintf(fn_err_full, "%s%s_err.png", REF_IMGS_PATH, fn_ref_no_ext); + + write_png_file(screen_buf, 800, 480, fn_err_full); + } - png_release(&p); + png_release(&p); - return !err; + return !err; } @@ -159,39 +141,39 @@ bool lv_test_assert_img_eq(const char * fn_ref) * STATIC FUNCTIONS **********************/ -static int read_png_file(png_img_t * p, const char* file_name) +static int read_png_file(png_img_t * p, const char * file_name) { char header[8]; // 8 is the maximum size that can be checked /*open file and test for it being a png*/ - FILE *fp = fopen(file_name, "rb"); - if (!fp) { - TEST_PRINTF("%s", "PNG file %s could not be opened for reading"); - return -1; + FILE * fp = fopen(file_name, "rb"); + if(!fp) { + TEST_PRINTF("[read_png_file %s] could not be opened for reading", file_name); + return ERR_FILE_NOT_FOUND; } size_t rcnt = fread(header, 1, 8, fp); - if (rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) { - TEST_PRINTF("%s is not recognized as a PNG file", file_name); - return -1; + if(rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) { + TEST_PRINTF("[read_png_file %s] not recognized as a PNG file", file_name); + return ERR_PNG; } /*initialize stuff*/ p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!p->png_ptr) { - TEST_PRINTF("%s", "png_create_read_struct failed"); - return -1; + if(!p->png_ptr) { + TEST_PRINTF("[read_png_file %s] png_create_read_struct failed", file_name); + return ERR_PNG; } p->info_ptr = png_create_info_struct(p->png_ptr); - if (!p->info_ptr) { - TEST_PRINTF("%s", "png_create_info_struct failed"); - return -1; + if(!p->info_ptr) { + TEST_PRINTF("[read_png_file %s] png_create_info_struct failed", file_name); + return ERR_PNG; } - if (setjmp(png_jmpbuf(p->png_ptr))) { - TEST_PRINTF("%s", "Error during init_io"); - return -1; + if(setjmp(png_jmpbuf(p->png_ptr))) { + TEST_PRINTF("[read_png_file %s] Error during init_io", file_name); + return ERR_PNG; } png_init_io(p->png_ptr, fp); png_set_sig_bytes(p->png_ptr, 8); @@ -207,15 +189,15 @@ static int read_png_file(png_img_t * p, const char* file_name) png_read_update_info(p->png_ptr, p->info_ptr); /*read file*/ - if (setjmp(png_jmpbuf(p->png_ptr))) { - TEST_PRINTF("%s", "Error during read_image"); - return -1; + if(setjmp(png_jmpbuf(p->png_ptr))) { + TEST_PRINTF("[read_png_file %s] Error during read_image", file_name); + return ERR_PNG; } - p->row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * p->height); + p->row_pointers = (png_bytep *) malloc(sizeof(png_bytep) * p->height); int y; - for (y=0; yheight; y++) - p->row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(p->png_ptr,p->info_ptr)); + for(y = 0; y < p->height; y++) + p->row_pointers[y] = (png_byte *) malloc(png_get_rowbytes(p->png_ptr, p->info_ptr)); png_read_image(p->png_ptr, p->row_pointers); @@ -223,10 +205,98 @@ static int read_png_file(png_img_t * p, const char* file_name) return 0; } + +static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name) +{ + png_structp png_ptr; + png_infop info_ptr; + + /* create file */ + FILE * fp = fopen(file_name, "wb"); + if(!fp) { + printf("###### %s\n", file_name); + fflush(stdout); + TEST_PRINTF("[write_png_file %s] could not be opened for writing", file_name); + TEST_PRINTF("%s", file_name); + return -1; + } + + /* initialize stuff */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if(!png_ptr) { + TEST_PRINTF("[write_png_file %s] png_create_write_struct failed", file_name); + return -1; + } + + info_ptr = png_create_info_struct(png_ptr); + if(!info_ptr) { + TEST_PRINTF("[write_png_file %s] png_create_info_struct failed", file_name); + return -1; + } + + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during init_io", file_name); + return -1; + } + + png_init_io(png_ptr, fp); + + /* write header */ + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during writing header", file_name); + return -1; + } + + png_set_IHDR(png_ptr, info_ptr, width, height, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_write_info(png_ptr, info_ptr); + + + /* write bytes */ + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during writing bytes", file_name); + return -1; + } + + uint8_t * raw_img8 = (uint8_t *)raw_img; + png_bytep * row_pointers = (png_bytep *) malloc(sizeof(png_bytep) * height); + for(uint32_t y = 0; y < height; y++) { + row_pointers[y] = malloc(3 * width); + uint8_t * line = raw_img8 + y * width * 4; + for(uint32_t x = 0; x < width; x++) { + row_pointers[y][x * 3 + 0] = line[x * 4 + 2]; + row_pointers[y][x * 3 + 1] = line[x * 4 + 1]; + row_pointers[y][x * 3 + 2] = line[x * 4 + 0]; + } + } + png_write_image(png_ptr, row_pointers); + + + /* end write */ + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during end of write", file_name); + return -1; + } + png_write_end(png_ptr, NULL); + + /* cleanup heap allocation */ + for(uint32_t y = 0; y < height; y++) free(row_pointers[y]); + free(row_pointers); + + png_destroy_write_struct(&png_ptr, &info_ptr); + + fclose(fp); + return 0; +} + + static void png_release(png_img_t * p) { int y; - for (y=0; yheight; y++) free(p->row_pointers[y]); + for(y = 0; y < p->height; y++) free(p->row_pointers[y]); free(p->row_pointers);