Browse Source

initial commit

master
Martin Vladic 2 years ago
commit
1f469ab418
  1. 8
      .gitignore
  2. 199
      CMakeLists.txt
  3. 35
      README.md
  4. 1954
      app.eez-project
  5. 11
      cmake.bat
  6. 361
      cmake/Emscripten.cmake
  7. 200
      cmake/FindSDL2.cmake
  8. 102
      cmake/FindSDL2_image.cmake
  9. 2589
      gui.eez-project
  10. BIN
      images/eez-flow-template-sdl.ico
  11. BIN
      images/eez-flow-template-sdl.png
  12. 22
      src/conf/eez/conf.h
  13. 11
      src/conf/eez/gui_conf.h
  14. 114
      src/gui/app_context.cpp
  15. 659
      src/gui/document.cpp
  16. 179
      src/gui/document.h
  17. 84
      src/main.cpp
  18. 111
      src/platform/simulator/emscripten/index.html
  19. 31
      src/platform/simulator/emscripten/main.css
  20. 35
      src/platform/simulator/emscripten/pre.js
  21. BIN
      src/platform/simulator/win32/icon.rc

8
.gitignore vendored

@ -0,0 +1,8 @@
build
.vscode/launch.json
.vscode/.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/*.log
*.eez-project-ui-state

199
CMakeLists.txt

@ -0,0 +1,199 @@
cmake_minimum_required(VERSION 3.10)
project(min_eez_sample)
set (CMAKE_CXX_STANDARD 17)
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /wd4100 /wd4214 /wd4200 /wd4244 /wd4456 /wd4457 /wd4458 /wd4459 /wd4245 /wd4389 /wd4706 /wd4611 /wd4310")
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-const-variable -Wno-nested-anon-types -Wno-dollar-in-identifier-extension -O2")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_CXX_FLAGS} -s DEMANGLE_SUPPORT=1 -s FORCE_FILESYSTEM=1 -s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=83886080 -s LLD_REPORT_UNDEFINED --bind -lidbfs.js --pre-js ${PROJECT_SOURCE_DIR}/src/platform/simulator/emscripten/pre.js")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --preload-file ../../images/eez.png")
add_definitions(-DEMCC_DEBUG)
endif()
if(NOT(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten"))
set(SDL2_BUILDING_LIBRARY 1)
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
include_directories(SYSTEM ${SDL2_INCLUDE_DIRS})
include_directories(SYSTEM ${SDL2IMAGE_INCLUDE_DIR})
endif()
if (UNIX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -pedantic")
endif (UNIX)
add_definitions(-DEEZ_PLATFORM_SIMULATOR)
if(WIN32)
ENABLE_LANGUAGE(RC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
add_definitions(-DEEZ_PLATFORM_SIMULATOR_WIN32)
endif()
if (UNIX)
add_definitions(-DEEZ_PLATFORM_SIMULATOR_UNIX)
endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten")
add_definitions(-DEEZ_PLATFORM_SIMULATOR_EMSCRIPTEN)
endif()
include_directories(
./
./eez/libs/agg
./eez/platform/simulator
./src/conf
)
set(src_files)
set(header_files)
################################################################################
# EEZ Framework files
file(GLOB_RECURSE src_eez
eez/*.cpp
eez/*.c
)
file(GLOB_RECURSE header_eez
eez/*.h
)
# exclude STM32 platform specific files
set (EXCLUDE_DIR "eez/platform/stm32")
foreach (TMP_PATH ${src_eez})
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND)
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1)
list (REMOVE_ITEM src_eez ${TMP_PATH})
endif ()
endforeach(TMP_PATH)
foreach (TMP_PATH ${header_eez})
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND)
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1)
list (REMOVE_ITEM header_eez ${TMP_PATH})
endif ()
endforeach(TMP_PATH)
# exclude libscpi
set (EXCLUDE_DIR "eez/libs/libscpi")
foreach (TMP_PATH ${src_eez})
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND)
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1)
list (REMOVE_ITEM src_eez ${TMP_PATH})
endif ()
endforeach(TMP_PATH)
foreach (TMP_PATH ${header_eez})
string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND)
if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1)
list (REMOVE_ITEM header_eez ${TMP_PATH})
endif ()
endforeach(TMP_PATH)
list (APPEND src_files ${src_eez})
list (APPEND header_files ${header_eez})
source_group(TREE "../../eez" PREFIX "eez" FILES ${src_eez} ${header_eez})
# TODO
#if(MSVC)
# set_source_files_properties(${src_eez_libs_libscpi} PROPERTIES COMPILE_FLAGS /W0)
#endif()
################################################################################
################################################################################
# SAMPLE files
file(GLOB_RECURSE src_sample
src/*.cpp
src/*.c
)
file(GLOB_RECURSE header_sample
src/*.h
)
list (APPEND src_files ${src_sample})
list (APPEND header_files ${header_sample})
source_group(TREE "../../src" PREFIX "src" FILES ${src_sample} ${header_sample})
################################################################################
if(WIN32)
set(src_win32_specific
./src/platform/simulator/win32/icon.rc
)
list (APPEND src_files ${src_win32_specific})
source_group("win32" FILES ${src_win32_specific})
set(SOURCES src/platform/simulator/win32/icon.rc ${src_files})
endif()
add_executable(min_eez_sample ${src_files} ${header_files})
if(MSVC)
target_compile_options(min_eez_sample PRIVATE "/MP")
endif()
if (UNIX AND NOT(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten"))
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(min_eez_sample Threads::Threads bsd)
endif ()
target_link_libraries(min_eez_sample ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})
if(WIN32)
target_link_libraries(min_eez_sample wsock32 ws2_32)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2-2.0.14/lib/x86/SDL2.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libjpeg-9.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libpng16-16.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libtiff-5.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/libwebp-7.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/SDL2_image.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${PROJECT_SOURCE_DIR}/../../SDL2_image-2.0.4/lib/x86/zlib1.dll"
$<TARGET_FILE_DIR:min_eez_sample>)
endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten")
add_custom_command(TARGET min_eez_sample POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/src/platform/simulator/emscripten"
$<TARGET_FILE_DIR:min_eez_sample>)
endif()

35
README.md

@ -0,0 +1,35 @@
### Ownership and License
The contributors are listed in CONTRIB.TXT. This project uses the GPL v3 license, see LICENSE.TXT.
This project uses the [C4.1 (Collective Code Construction Contract)](http://rfc.zeromq.org/spec:22) process for contributions.
To report an issue, use the [issues page](https://github.com/eez-open/eez-flow-template-sdl/issues) tracker.
## Build
#### Linux
```
sudo apt-get update
sudo apt-get install -y git libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev cmake build-essential libbsd-dev
git clone https://github.com/eez-open/eez-flow-template-sdl
mkdir -p eez-flow-template-sdl/build/linux
cd eez-flow-template-sdl/build/linux
cmake ../..
make
```
Start simulator with:
```
./eez-flow-template-sdl
```
#### Windows
Install [Visual Studio Community 2017](https://visualstudio.microsoft.com/downloads/) and [CMake](https://cmake.org/install/).
Use git to clone https://github.com/eez-open/eez-flow-template-sdl.
Execute `cmake.bat`.
Visual Studio solution is created in `\path\to\eez-flow-template-sdl\build\win32`.

1954
app.eez-project

File diff suppressed because it is too large Load Diff

11
cmake.bat

@ -0,0 +1,11 @@
set SDL2DIR=..\..\SDL2-2.0.14
set SDL2IMAGEDIR=..\..\SDL2_image-2.0.4
if not exist "build" mkdir "build"
if not exist "build\win32" mkdir "build\win32"
cd build\win32
cmake ..\..
cd ..\..

361
cmake/Emscripten.cmake

@ -0,0 +1,361 @@
# This file is a 'toolchain description file' for CMake.
# It teaches CMake about the Emscripten compiler, so that CMake can generate makefiles
# from CMakeLists.txt that invoke emcc.
# At the moment this required minimum version is not exact (i.e. we do not know of a feature that needs CMake 3.0.0 specifically)
# It is possible that CMake 3.0.0 is too old and will not actually work. If you do find such a case, please report it at Emscripten
# bug tracker to revise the minimum requirement. See also https://github.com/juj/emsdk/issues/108
cmake_minimum_required(VERSION 3.0.0)
# To use this toolchain file with CMake, invoke CMake with the following command line parameters
# cmake -DCMAKE_TOOLCHAIN_FILE=<EmscriptenRoot>/cmake/Modules/Platform/Emscripten.cmake
# -DCMAKE_BUILD_TYPE=<Debug|RelWithDebInfo|Release|MinSizeRel>
# -G "Unix Makefiles" (Linux and OSX)
# -G "MinGW Makefiles" (Windows)
# <path/to/CMakeLists.txt> # Note, pass in here ONLY the path to the file, not the filename 'CMakeLists.txt' itself.
# After that, build the generated Makefile with the command 'make'. On Windows, you may download and use 'mingw32-make' instead.
# The following variable describes the target OS we are building to.
set(CMAKE_SYSTEM_NAME Emscripten)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_CROSSCOMPILING TRUE)
# Advertise Emscripten as a 32-bit platform (as opposed to CMAKE_SYSTEM_PROCESSOR=x86_64 for 64-bit platform),
# since some projects (e.g. OpenCV) use this to detect bitness.
set(CMAKE_SYSTEM_PROCESSOR x86)
# Tell CMake how it should instruct the compiler to generate multiple versions of an outputted .so library: e.g. "libfoo.so, libfoo.so.1, libfoo.so.1.4" etc.
# This feature is activated if a shared library project has the property SOVERSION defined.
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
# In CMake, CMAKE_HOST_WIN32 is set when we are cross-compiling from Win32 to Emscripten: http://www.cmake.org/cmake/help/v2.8.12/cmake.html#variable:CMAKE_HOST_WIN32
# The variable WIN32 is set only when the target arch that will run the code will be WIN32, so unset WIN32 when cross-compiling.
set(WIN32)
# The same logic as above applies for APPLE and CMAKE_HOST_APPLE, so unset APPLE.
set(APPLE)
# And for UNIX and CMAKE_HOST_UNIX. However, Emscripten is often able to mimic being a Linux/Unix system, in which case a lot of existing CMakeLists.txt files can be configured for Emscripten while assuming UNIX build, so this is left enabled.
set(UNIX 1)
# Do a no-op access on the CMAKE_TOOLCHAIN_FILE variable so that CMake will not issue a warning on it being unused.
if (CMAKE_TOOLCHAIN_FILE)
endif()
# In order for check_function_exists() detection to work, we must signal it to pass an additional flag, which causes the compilation
# to abort if linking results in any undefined symbols. The CMake detection mechanism depends on the undefined symbol error to be raised.
# Disable wasm in cmake checks so that (1) we do not depend on wasm support just for configuration (perhaps the user does not intend
# to build to wasm; using asm.js only depends on js which we need anyhow), and (2) we don't have issues with a separate .wasm file
# on the side, async startup, etc..
set(CMAKE_REQUIRED_FLAGS "-s WASM=0")
# Locate where the Emscripten compiler resides in relative to this toolchain file.
if ("${EMSCRIPTEN_ROOT_PATH}" STREQUAL "")
get_filename_component(GUESS_EMSCRIPTEN_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
if (EXISTS "${GUESS_EMSCRIPTEN_ROOT_PATH}/emranlib")
set(EMSCRIPTEN_ROOT_PATH "${GUESS_EMSCRIPTEN_ROOT_PATH}")
endif()
endif()
# If not found by above search, locate using the EMSCRIPTEN environment variable.
if ("${EMSCRIPTEN_ROOT_PATH}" STREQUAL "")
set(EMSCRIPTEN_ROOT_PATH "$ENV{EMSCRIPTEN}")
endif()
# Abort if not found.
if ("${EMSCRIPTEN_ROOT_PATH}" STREQUAL "")
message(FATAL_ERROR "Could not locate the Emscripten compiler toolchain directory! Either set the EMSCRIPTEN environment variable, or pass -DEMSCRIPTEN_ROOT_PATH=xxx to CMake to explicitly specify the location of the compiler!")
endif()
# Normalize, convert Windows backslashes to forward slashes or CMake will crash.
get_filename_component(EMSCRIPTEN_ROOT_PATH "${EMSCRIPTEN_ROOT_PATH}" ABSOLUTE)
list(APPEND CMAKE_MODULE_PATH "${EMSCRIPTEN_ROOT_PATH}/cmake/Modules")
list(APPEND CMAKE_FIND_ROOT_PATH "${EMSCRIPTEN_ROOT_PATH}/system")
if (CMAKE_HOST_WIN32)
set(EMCC_SUFFIX ".bat")
else()
set(EMCC_SUFFIX "")
endif()
# Specify the compilers to use for C and C++
if ("${CMAKE_C_COMPILER}" STREQUAL "")
set(CMAKE_C_COMPILER "${EMSCRIPTEN_ROOT_PATH}/emcc${EMCC_SUFFIX}")
endif()
if ("${CMAKE_CXX_COMPILER}" STREQUAL "")
set(CMAKE_CXX_COMPILER "${EMSCRIPTEN_ROOT_PATH}/em++${EMCC_SUFFIX}")
endif()
if ("${CMAKE_AR}" STREQUAL "")
set(CMAKE_AR "${EMSCRIPTEN_ROOT_PATH}/emar${EMCC_SUFFIX}" CACHE FILEPATH "Emscripten ar")
endif()
if ("${CMAKE_RANLIB}" STREQUAL "")
set(CMAKE_RANLIB "${EMSCRIPTEN_ROOT_PATH}/emranlib${EMCC_SUFFIX}" CACHE FILEPATH "Emscripten ranlib")
endif()
# Don't allow CMake to autodetect the compiler, since it does not understand Emscripten.
# Pass -DEMSCRIPTEN_FORCE_COMPILERS=OFF to disable (sensible mostly only for testing/debugging purposes).
option(EMSCRIPTEN_FORCE_COMPILERS "Force C/C++ compiler" ON)
if (EMSCRIPTEN_FORCE_COMPILERS)
# Detect version of the 'emcc' executable. Note that for CMake, we tell it the version of the Clang compiler and not the version of Emscripten,
# because CMake understands Clang better.
if (NOT CMAKE_C_COMPILER_VERSION) # Toolchain script is interpreted multiple times, so don't rerun the check if already done before.
execute_process(COMMAND "${CMAKE_C_COMPILER}" "-v" RESULT_VARIABLE _cmake_compiler_result ERROR_VARIABLE _cmake_compiler_output OUTPUT_QUIET)
if (NOT _cmake_compiler_result EQUAL 0)
message(FATAL_ERROR "Failed to fetch compiler version information with command \"'${CMAKE_C_COMPILER}' -v\"! Process returned with error code ${_cmake_compiler_result}.")
endif()
if (NOT "${_cmake_compiler_output}" MATCHES "[Ee]mscripten")
message(FATAL_ERROR "System LLVM compiler cannot be used to build with Emscripten! Check Emscripten's LLVM toolchain location in .emscripten configuration file, and make sure to point CMAKE_C_COMPILER to where emcc is located. (was pointing to \"${CMAKE_C_COMPILER}\")")
endif()
string(REGEX MATCH "clang version ([0-9\\.]+)" _dummy_unused "${_cmake_compiler_output}")
if (NOT CMAKE_MATCH_1)
message(FATAL_ERROR "Failed to regex parse Clang compiler version from version string: ${_cmake_compiler_output}")
endif()
set(CMAKE_C_COMPILER_VERSION "${CMAKE_MATCH_1}")
set(CMAKE_CXX_COMPILER_VERSION "${CMAKE_MATCH_1}")
if (${CMAKE_C_COMPILER_VERSION} VERSION_LESS 3.9.0)
message(WARNING "CMAKE_C_COMPILER version looks too old. Was ${CMAKE_C_COMPILER_VERSION}, should be at least 3.9.0.")
endif()
endif()
# Capture the Emscripten version to EMSCRIPTEN_VERSION variable.
if (NOT EMSCRIPTEN_VERSION)
execute_process(COMMAND "${CMAKE_C_COMPILER}" "-v" RESULT_VARIABLE _cmake_compiler_result ERROR_VARIABLE _cmake_compiler_output OUTPUT_QUIET)
if (NOT _cmake_compiler_result EQUAL 0)
message(FATAL_ERROR "Failed to fetch Emscripten version information with command \"'${CMAKE_C_COMPILER}' -v\"! Process returned with error code ${_cmake_compiler_result}.")
endif()
string(REGEX MATCH "emcc \\(.*\\) ([0-9\\.]+)" _dummy_unused "${_cmake_compiler_output}")
if (NOT CMAKE_MATCH_1)
message(FATAL_ERROR "Failed to regex parse Emscripten compiler version from version string: ${_cmake_compiler_output}")
endif()
set(EMSCRIPTEN_VERSION "${CMAKE_MATCH_1}")
endif()
set(CMAKE_C_COMPILER_ID_RUN TRUE)
set(CMAKE_C_COMPILER_FORCED TRUE)
set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_C_COMPILER_ID Clang)
set(CMAKE_C_STANDARD_COMPUTED_DEFAULT 11)
set(CMAKE_CXX_COMPILER_ID_RUN TRUE)
set(CMAKE_CXX_COMPILER_FORCED TRUE)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_CXX_COMPILER_ID Clang)
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT 98)
set(CMAKE_C_PLATFORM_ID "emscripten")
set(CMAKE_CXX_PLATFORM_ID "emscripten")
if ("${CMAKE_VERSION}" VERSION_LESS "3.8")
set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert")
set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes")
set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros")
set(CMAKE_C11_COMPILE_FEATURES "c_static_assert")
set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters")
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
else()
set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert")
set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes")
set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros")
set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert")
set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17")
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
endif()
endif()
# To find programs to execute during CMake run time with find_program(), e.g. 'git' or so, we allow looking
# into system paths.
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Since Emscripten is a cross-compiler, we should never look at the system-provided directories like /usr/include and so on.
# Therefore only CMAKE_FIND_ROOT_PATH should be used as a find directory. See http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_FIND_ROOT_PATH_MODE_INCLUDE.html
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_SYSTEM_INCLUDE_PATH "${EMSCRIPTEN_ROOT_PATH}/system/include")
# We would prefer to specify a standard set of Clang+Emscripten-friendly common convention for suffix files, especially for CMake executable files,
# but if these are adjusted, ${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake will fail, since it depends on being able to compile output files with predefined names.
#SET(CMAKE_LINK_LIBRARY_SUFFIX "")
#SET(CMAKE_STATIC_LIBRARY_PREFIX "")
#SET(CMAKE_SHARED_LIBRARY_PREFIX "")
#SET(CMAKE_FIND_LIBRARY_PREFIXES "")
#SET(CMAKE_FIND_LIBRARY_SUFFIXES ".bc")
#SET(CMAKE_SHARED_LIBRARY_SUFFIX ".bc")
option(EMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES "If set, static library targets generate LLVM bitcode files (.bc). If disabled (default), UNIX ar archives (.a) are generated." OFF)
if (EMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES)
SET(CMAKE_STATIC_LIBRARY_SUFFIX ".bc")
SET(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_C_COMPILER> -o <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_CXX_COMPILER> -o <TARGET> <LINK_FLAGS> <OBJECTS>")
else()
# Specify the program to use when building static libraries. Force Emscripten-related command line options to clang.
SET(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> rc <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> rc <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
SET(CMAKE_EXECUTABLE_SUFFIX ".js")
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 1)
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES 1)
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 1)
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 1)
set(CMAKE_C_RESPONSE_FILE_LINK_FLAG "@")
set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@")
# Set a global EMSCRIPTEN variable that can be used in client CMakeLists.txt to detect when building using Emscripten.
set(EMSCRIPTEN 1 CACHE BOOL "If true, we are targeting Emscripten output.")
# Hardwire support for cmake-2.8/Modules/CMakeBackwardsCompatibilityC.cmake without having CMake to try complex things
# to autodetect these:
set(CMAKE_SKIP_COMPATIBILITY_TESTS 1)
set(CMAKE_SIZEOF_CHAR 1)
set(CMAKE_SIZEOF_UNSIGNED_SHORT 2)
set(CMAKE_SIZEOF_SHORT 2)
set(CMAKE_SIZEOF_INT 4)
set(CMAKE_SIZEOF_UNSIGNED_LONG 4)
set(CMAKE_SIZEOF_UNSIGNED_INT 4)
set(CMAKE_SIZEOF_LONG 4)
set(CMAKE_SIZEOF_VOID_P 4)
set(CMAKE_SIZEOF_FLOAT 4)
set(CMAKE_SIZEOF_DOUBLE 8)
set(CMAKE_C_SIZEOF_DATA_PTR 4)
set(CMAKE_CXX_SIZEOF_DATA_PTR 4)
set(CMAKE_HAVE_LIMITS_H 1)
set(CMAKE_HAVE_UNISTD_H 1)
set(CMAKE_HAVE_PTHREAD_H 1)
set(CMAKE_HAVE_SYS_PRCTL_H 1)
set(CMAKE_WORDS_BIGENDIAN 0)
set(CMAKE_DL_LIBS)
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELEASE")
set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG -Os" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_MINSIZEREL")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_C_FLAGS_RELWITHDEBINFO")
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELEASE")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG -Os" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_MINSIZEREL")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2" CACHE STRING "Emscripten-overridden CMAKE_CXX_FLAGS_RELWITHDEBINFO")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELEASE")
set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_MINSIZEREL")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELEASE")
set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL")
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO")
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "-O2" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELEASE")
set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "-Os" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL")
set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Emscripten-overridden CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO")
function(em_validate_asmjs_after_build target)
add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo Validating build output for asm.js... COMMAND "python" ARGS "${EMSCRIPTEN_ROOT_PATH}/tools/validate_asmjs.py" "$<TARGET_FILE:${target}>")
endfunction()
# A global counter to guarantee unique names for js library files.
set(link_js_counter 1)
# Internal function: Do not call from user CMakeLists.txt files. Use one of em_link_js_library()/em_link_pre_js()/em_link_post_js() instead.
function(em_add_tracked_link_flag target flagname)
# User can input list of JS files either as a single list, or as variable arguments to this function, so iterate over varargs, and treat each
# item in varargs as a list itself, to support both syntax forms.
foreach(jsFileList ${ARGN})
foreach(jsfile ${jsFileList})
# If the user edits the JS file, we want to relink the emscripten application, but unfortunately it is not possible to make a link step
# depend directly on a source file. Instead, we must make a dummy no-op build target on that source file, and make the project depend on
# that target.
# Sanitate the source .js filename to a good symbol name to use as a dummy filename.
get_filename_component(jsname "${jsfile}" NAME)
string(REGEX REPLACE "[/:\\\\.\ ]" "_" dummy_js_target ${jsname})
set(dummy_lib_name ${target}_${link_js_counter}_${dummy_js_target})
set(dummy_c_name "${CMAKE_BINARY_DIR}/${dummy_js_target}_tracker.c")
# Create a new static library target that with a single dummy .c file.
add_library(${dummy_lib_name} STATIC ${dummy_c_name})
# Make the dummy .c file depend on the .js file we are linking, so that if the .js file is edited, the dummy .c file, and hence the static library will be rebuild (no-op). This causes the main application to be relinked, which is what we want.
# This approach was recommended by http://www.cmake.org/pipermail/cmake/2010-May/037206.html
add_custom_command(OUTPUT ${dummy_c_name} COMMAND ${CMAKE_COMMAND} -E touch ${dummy_c_name} DEPENDS ${jsfile})
target_link_libraries(${target} ${dummy_lib_name})
# Link the js-library to the target
# When a linked library starts with a "-" cmake will just add it to the linker command line as it is.
# The advantage of doing it this way is that the js-library will also be automatically linked to targets
# that depend on this target.
get_filename_component(js_file_absolute_path "${jsfile}" ABSOLUTE )
target_link_libraries(${target} "${flagname} \"${js_file_absolute_path}\"")
math(EXPR link_js_counter "${link_js_counter} + 1")
endforeach()
endforeach()
endfunction()
# This function links a (list of ) .js library file(s) to the given CMake project.
# Example: em_link_js_library(my_executable "lib1.js" "lib2.js")
# will result in emcc passing --js-library lib1.js --js-library lib2.js to the emscripten linker, as well as
# tracking the modification timestamp between the linked .js files and the main project, so that editing the .js file
# will cause the target project to be relinked.
function(em_link_js_library target)
em_add_tracked_link_flag(${target} "--js-library" ${ARGN})
endfunction()
# This function is identical to em_link_js_library(), except the .js files will be added with '--pre-js file.js' command line flag,
# which is generally used to add some preamble .js code to a generated output file.
function(em_link_pre_js target)
em_add_tracked_link_flag(${target} "--pre-js" ${ARGN})
endfunction()
# This function is identical to em_link_js_library(), except the .js files will be added with '--post-js file.js' command line flag,
# which is generally used to add some postamble .js code to a generated output file.
function(em_link_post_js target)
em_add_tracked_link_flag(${target} "--post-js" ${ARGN})
endfunction()
# Experimental support for targeting generation of Visual Studio project files (vs-tool) of Emscripten projects for Windows.
# To use this, pass the combination -G "Visual Studio 10" -DCMAKE_TOOLCHAIN_FILE=Emscripten.cmake
if ("${CMAKE_GENERATOR}" MATCHES "^Visual Studio.*")
# By default, CMake generates VS project files with a <GenerateManifest>true</GenerateManifest> directive.
# This causes VS to attempt to invoke rc.exe during the build, which will fail since app manifests are meaningless for Emscripten.
# To disable this, add the following linker flag. This flag will not go to emcc, since the Visual Studio CMake generator will swallow it.
set(EMSCRIPTEN_VS_LINKER_FLAGS "/MANIFEST:NO")
# CMake is hardcoded to write a ClCompile directive <ObjectFileName>$(IntDir)</ObjectFileName> in all VS project files it generates.
# This makes VS pass emcc a -o param that points to a directory instead of a file, which causes emcc autogenerate the output filename.
# CMake is hardcoded to assume all object files have the suffix .obj, so adjust the emcc-autogenerated default suffix name to match.
set(EMSCRIPTEN_VS_LINKER_FLAGS "${EMSCRIPTEN_VS_LINKER_FLAGS} --default-obj-ext .obj")
# Also hint CMake that it should not hardcode <ObjectFileName> generation. Requires a custom CMake build for this to work (ignored on others)
# See http://www.cmake.org/Bug/view.php?id=14673 and https://github.com/juj/CMake
set(CMAKE_VS_NO_DEFAULT_OBJECTFILENAME 1)
# Apply and cache Emscripten Visual Studio IDE-specific linker flags.
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "")
endif()
if (NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
find_program(NODE_JS_EXECUTABLE NAMES nodejs node)
if(NODE_JS_EXECUTABLE)
set(CMAKE_CROSSCOMPILING_EMULATOR "${NODE_JS_EXECUTABLE}" CACHE FILEPATH "Path to the emulator for the target system.")
endif()
endif()
# No-op on CMAKE_CROSSCOMPILING_EMULATOR so older versions of cmake do not
# complain about unused CMake variable.
if(CMAKE_CROSSCOMPILING_EMULATOR)
endif()

200
cmake/FindSDL2.cmake

@ -0,0 +1,200 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#.rst:
# FindSDL2
# -------
#
# Locate SDL2 library
#
# This module defines
#
# ::
#
# SDL2_LIBRARY, the name of the library to link against
# SDL2_FOUND, if false, do not try to link to SDL
# SDL2_INCLUDE_DIR, where to find SDL.h
# SDL2_VERSION_STRING, human-readable string containing the version of SDL
#
#
#
# This module responds to the flag:
#
# ::
#
# SDL2_BUILDING_LIBRARY
# If this is defined, then no SDL2_main will be linked in because
# only applications need main().
# Otherwise, it is assumed you are building an application and this
# module will attempt to locate and set the proper link flags
# as part of the returned SDL2_LIBRARY variable.
#
#
#
# Don't forget to include SDLmain.h and SDLmain.m your project for the
# OS X framework based version. (Other versions link to -lSDLmain which
# this module will try to find on your behalf.) Also for OS X, this
# module will automatically add the -framework Cocoa on your behalf.
#
#
#
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your
# configuration and no SDL2_LIBRARY, it means CMake did not find your SDL
# library (SDL.dll, libsdl.so, SDL.framework, etc). Set
# SDL2_LIBRARY_TEMP to point to your SDL library, and configure again.
# Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this
# value as appropriate. These values are used to generate the final
# SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY
# does not get created.
#
#
#
# $SDL2DIR is an environment variable that would correspond to the
# ./configure --prefix=$SDL2DIR used in building SDL. l.e.galup 9-20-02
#
# Modified by Eric Wing. Added code to assist with automated building
# by using environmental variables and providing a more
# controlled/consistent search behavior. Added new modifications to
# recognize OS X frameworks and additional Unix paths (FreeBSD, etc).
# Also corrected the header search path to follow "proper" SDL
# guidelines. Added a search for SDLmain which is needed by some
# platforms. Added a search for threads which is needed by some
# platforms. Added needed compile switches for MinGW.
#
# On OSX, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of SDL2_LIBRARY to
# override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths.
#
# Note that the header path has changed from SDL/SDL.h to just SDL.h
# This needed to change because "proper" SDL convention is #include
# "SDL.h", not <SDL/SDL.h>. This is done for portability reasons
# because not all systems place things in SDL/ (see FreeBSD).
if(NOT SDL2_DIR)
set(SDL2_DIR "" CACHE PATH "SDL2 directory")
endif()
find_path(SDL2_INCLUDE_DIR SDL.h
HINTS
ENV SDL2DIR
${SDL2_DIR}
PATH_SUFFIXES SDL2
# path suffixes to search inside ENV{SDL2DIR}
include/SDL2 include
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(VC_LIB_PATH_SUFFIX lib/x64)
else()
set(VC_LIB_PATH_SUFFIX lib/x86)
endif()
find_library(SDL2_LIBRARY_TEMP
NAMES SDL2
HINTS
ENV SDL2DIR
${SDL2_DIR}
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
)
# Hide this cache variable from the user, it's an internal implementation
# detail. The documented library variable for the user is SDL2_LIBRARY
# which is derived from SDL2_LIBRARY_TEMP further below.
set_property(CACHE SDL2_LIBRARY_TEMP PROPERTY TYPE INTERNAL)
if(NOT SDL2_BUILDING_LIBRARY)
if(NOT SDL2_INCLUDE_DIR MATCHES ".framework")
# Non-OS X framework versions expect you to also dynamically link to
# SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms
# seem to provide SDLmain for compatibility even though they don't
# necessarily need it.
find_library(SDL2MAIN_LIBRARY
NAMES SDL2main
HINTS
ENV SDL2DIR
${SDL2_DIR}
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
PATHS
/sw
/opt/local
/opt/csw
/opt
)
endif()
endif()
# SDL may require threads on your system.
# The Apple build may not need an explicit flag because one of the
# frameworks may already provide it.
# But for non-OSX systems, I will use the CMake Threads package.
if(NOT APPLE)
find_package(Threads)
endif()
# MinGW needs an additional link flag, -mwindows
# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -mwindows
if(MINGW)
set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW")
endif()
if(SDL2_LIBRARY_TEMP)
# For SDLmain
if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY)
list(FIND SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" _SDL2_MAIN_INDEX)
if(_SDL2_MAIN_INDEX EQUAL -1)
set(SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP})
endif()
unset(_SDL2_MAIN_INDEX)
endif()
# For OS X, SDL uses Cocoa as a backend so it must link to Cocoa.
# CMake doesn't display the -framework Cocoa string in the UI even
# though it actually is there if I modify a pre-used variable.
# I think it has something to do with the CACHE STRING.
# So I use a temporary variable until the end so I can set the
# "real" variable in one-shot.
if(APPLE)
set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
endif()
# For threads, as mentioned Apple doesn't need this.
# In fact, there seems to be a problem if I used the Threads package
# and try using this line, so I'm just skipping it entirely for OS X.
if(NOT APPLE)
set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
endif()
# For MinGW library
if(MINGW)
set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
endif()
# Set the final string here so the GUI reflects the final state.
set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found")
endif()
if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h")
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$")
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$")
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$")
string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}")
string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}")
string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}")
set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH})
unset(SDL2_VERSION_MAJOR_LINE)
unset(SDL2_VERSION_MINOR_LINE)
unset(SDL2_VERSION_PATCH_LINE)
unset(SDL2_VERSION_MAJOR)
unset(SDL2_VERSION_MINOR)
unset(SDL2_VERSION_PATCH)
endif()
set(SDL2_LIBRARIES ${SDL2_LIBRARY} ${SDL2MAIN_LIBRARY})
set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR})
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR
VERSION_VAR SDL2_VERSION_STRING)

102
cmake/FindSDL2_image.cmake

@ -0,0 +1,102 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#.rst:
# FindSDL2_image
# -------------
#
# Locate SDL2_image library
#
# This module defines:
#
# ::
#
# SDL2_IMAGE_LIBRARIES, the name of the library to link against
# SDL2_IMAGE_INCLUDE_DIRS, where to find the headers
# SDL2_IMAGE_FOUND, if false, do not try to link against
# SDL2_IMAGE_VERSION_STRING - human-readable string containing the
# version of SDL2_image
#
#
#
# For backward compatibility the following variables are also set:
#
# ::
#
# SDL2IMAGE_LIBRARY (same value as SDL2_IMAGE_LIBRARIES)
# SDL2IMAGE_INCLUDE_DIR (same value as SDL2_IMAGE_INCLUDE_DIRS)
# SDL2IMAGE_FOUND (same value as SDL2_IMAGE_FOUND)
#
#
#
# $SDLDIR is an environment variable that would correspond to the
# ./configure --prefix=$SDLDIR used in building SDL.
#
# Created by Eric Wing. This was influenced by the FindSDL.cmake
# module, but with modifications to recognize OS X frameworks and
# additional Unix paths (FreeBSD, etc).
if(NOT SDL2_IMAGE_INCLUDE_DIR AND SDL2IMAGE_INCLUDE_DIR)
set(SDL2_IMAGE_INCLUDE_DIR ${SDL2IMAGE_INCLUDE_DIR} CACHE PATH "directory cache
entry initialized from old variable name")
endif()
find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h
HINTS
ENV SDL2IMAGEDIR
ENV SDL2DIR
${SDL2_DIR}
PATH_SUFFIXES SDL2
# path suffixes to search inside ENV{SDL2DIR}
include/SDL2 include
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(VC_LIB_PATH_SUFFIX lib/x64)
else()
set(VC_LIB_PATH_SUFFIX lib/x86)
endif()
if(NOT SDL2_IMAGE_LIBRARY AND SDL2IMAGE_LIBRARY)
set(SDL2_IMAGE_LIBRARY ${SDL2IMAGE_LIBRARY} CACHE FILEPATH "file cache entry
initialized from old variable name")
endif()
find_library(SDL2_IMAGE_LIBRARY
NAMES SDL2_image
HINTS
ENV SDL2IMAGEDIR
ENV SDL2DIR
${SDL2_DIR}
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
)
if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h")
file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$")
file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+[0-9]+$")
file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+[0-9]+$")
string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}")
string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}")
string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}")
set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH})
unset(SDL2_IMAGE_VERSION_MAJOR_LINE)
unset(SDL2_IMAGE_VERSION_MINOR_LINE)
unset(SDL2_IMAGE_VERSION_PATCH_LINE)
unset(SDL2_IMAGE_VERSION_MAJOR)
unset(SDL2_IMAGE_VERSION_MINOR)
unset(SDL2_IMAGE_VERSION_PATCH)
endif()
set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY})
set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR})
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image
REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS
VERSION_VAR SDL2_IMAGE_VERSION_STRING)
# for backward compatibility
set(SDL2IMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES})
set(SDL2IMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS})
set(SDL2IMAGE_FOUND ${SDL2_IMAGE_FOUND})
mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR)

2589
gui.eez-project

File diff suppressed because it is too large Load Diff

BIN
images/eez-flow-template-sdl.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
images/eez-flow-template-sdl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

22
src/conf/eez/conf.h

@ -0,0 +1,22 @@
#pragma once
#include <stdint.h>
static const uint32_t DISPLAY_WIDTH = 480;
static const uint32_t DISPLAY_HEIGHT = 272;
static const uint32_t DISPLAY_BPP = 32; // RGBA8888
static const char *TITLE = "EEZ Flow App";
static const char *ICON = "eez-flow-template-sdl.png";
#define MAX_NUM_OF_Y_AXES 18
#define MAX_NUM_OF_Y_VALUES MAX_NUM_OF_Y_AXES
#define OPTION_KEYBOARD 0
#define OPTION_MOUSE 0
#define CUSTOM_VALUE_TYPES
#define DISPLAY_BACKGROUND_LUMINOSITY_STEP_MIN 0
#define DISPLAY_BACKGROUND_LUMINOSITY_STEP_MAX 20
#define DISPLAY_BACKGROUND_LUMINOSITY_STEP_DEFAULT 10

11
src/conf/eez/gui_conf.h

@ -0,0 +1,11 @@
#pragma once
#include "../../gui/document.h"
#define PAGE_ID_NUMERIC_KEYPAD -1
#define PAGE_ID_ASYNC_OPERATION_IN_PROGRESS 0
#define COLOR_ID_BOOKMARK 0
/// Maximum allowed length (including label) of the keypad text.
#define MAX_KEYPAD_TEXT_LENGTH 128
#define MAX_KEYPAD_LABEL_LENGTH 64

114
src/gui/app_context.cpp

@ -0,0 +1,114 @@
#include <eez/core/sound.h>
#include <eez/gui/gui.h>
#include <eez/gui/keypad.h>
#include <SDL.h>
////////////////////////////////////////////////////////////////////////////////
namespace eez {
namespace gui {
const EnumItem *g_enumDefinitions[] = { nullptr };
static class : public AppContext {
public:
void stateManagment() override {
AppContext::stateManagment();
if (getActivePageId() == PAGE_ID_NONE) {
showPage(getMainPageId());
}
}
protected:
int getMainPageId() override {
return PAGE_ID_MAIN;
}
} g_myAppContext;
AppContext *getAppContextFromId(int16_t id) { return &g_myAppContext; }
void executeNumericKeypadOptionHook(int optionActionIndex) { }
Keypad *getActiveKeypad() { return nullptr; }
NumericKeypad *getActiveNumericKeypad() { return nullptr; }
void action_edit() { }
} // namespace gui
} // namespace eez
////////////////////////////////////////////////////////////////////////////////
namespace eez {
bool g_shutdown;
void shutdown() { g_shutdown = true; }
namespace keyboard {
void onKeyboardEvent(SDL_KeyboardEvent *key) { }
} // keyboard
namespace sound {
void playBeep(bool force) {}
void playClick() {}
} // namespace sound
} // namespace eez
////////////////////////////////////////////////////////////////////////////////
#ifdef _WIN32
#undef INPUT
#undef OUTPUT
#include <Shlobj.h>
#include <Windows.h>
#include <direct.h>
#else
#include <string.h>
#include <pwd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#endif
namespace eez {
char *getConfFilePath(const char *file_name) {
static char file_path[1024];
*file_path = 0;
#ifdef _WIN32
if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, file_path))) {
stringAppendString(file_path, sizeof(file_path), "\\.min_eez_sample");
_mkdir(file_path);
stringAppendString(file_path, sizeof(file_path), "\\");
}
#elif defined(__EMSCRIPTEN__)
stringAppendString(file_path, sizeof(file_path), "/min_eez_sample/");
#else
const char *home_dir = 0;
if ((home_dir = getenv("HOME")) == NULL) {
home_dir = getpwuid(getuid())->pw_dir;
}
if (home_dir) {
stringAppendString(file_path, sizeof(file_path), home_dir);
stringAppendString(file_path, sizeof(file_path), "/.min_eez_sample");
mkdir(file_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
stringAppendString(file_path, sizeof(file_path), "/");
}
#endif
char *q = file_path + strlen(file_path);
const char *p = file_name;
while (*p) {
char ch = *p++;
#ifdef _WIN32
if (ch == '/')
*q++ = '\\';
#else
if (ch == '\\')
*q++ = '/';
#endif
else
*q++ = ch;
}
*q = 0;
return file_path;
}
} // eez

659
src/gui/document.cpp

@ -0,0 +1,659 @@
#include "document.h"
namespace eez {
namespace gui {
DataOperationsFunction g_dataOperationsFunctions[] = {
data_none,
data_alert_message,
data_touch_calibration_point,
data_keypad_text,
data_keypad_edit_unit,
data_keypad_sign_enabled,
data_keypad_unit_enabled,
data_keypad_dot_enabled,
data_keypad_option1_enabled,
data_keypad_option1_text,
data_keypad_option2_enabled,
data_keypad_option2_text,
data_keypad_option3_enabled,
data_keypad_option3_text,
data_keypad_mode,
data_keypad_ok_enabled
};
ActionExecFunc g_actionExecFunctions[] = {
0,
action_yes,
action_no,
action_cancel,
action_edit,
action_drag_overlay,
action_scroll,
action_keypad_key,
action_keypad_back,
action_keypad_unit,
action_keypad_option1,
action_keypad_option2,
action_keypad_option3,
action_keypad_sign,
action_keypad_ok,
action_keypad_cancel,
action_toggle_keypad_mode,
action_keypad_space
};
// ASSETS DEFINITION
const uint8_t assets[9722] = {
0x7E, 0x65, 0x65, 0x7A, 0x03, 0x00, 0x01, 0x00, 0x70, 0x49, 0x00, 0x00, 0xF0, 0x01, 0x03, 0x00,
0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x00,
0x26, 0x98, 0x00, 0x01, 0x00, 0x2E, 0xA4, 0x00, 0x01, 0x00, 0x17, 0xB4, 0x0C, 0x00, 0xF2, 0x63,
0xCC, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00,
0x44, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00,
0xD4, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00,
0x64, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0xAC, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00,
0xF4, 0x02, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00,
0x84, 0x03, 0x00, 0x00, 0xA8, 0x03, 0x00, 0x00, 0xCC, 0x03, 0x00, 0x00, 0xE8, 0x03, 0x00, 0x00,
0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x24, 0x04, 0xA4, 0x00, 0xA6, 0x30, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xEC, 0x47, 0x8C,
0x00, 0x15, 0x01, 0x0A, 0x00, 0x51, 0xE0, 0x01, 0x10, 0x01, 0x0F, 0x10, 0x00, 0x5F, 0x3C, 0x04,
0x00, 0x00, 0x08, 0x1C, 0x00, 0x04, 0x1F, 0x40, 0x1C, 0x00, 0x04, 0x00, 0x60, 0x00, 0x13, 0x44,
0x1C, 0x00, 0x70, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x82, 0x00, 0x21, 0x00, 0x20, 0x24,
0x00, 0x15, 0x05, 0x2E, 0x00, 0x22, 0x02, 0xFF, 0x08, 0x00, 0x0F, 0x24, 0x00, 0x0B, 0x40, 0x14,
0x14, 0x14, 0x14, 0x24, 0x00, 0x7F, 0x0E, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0E, 0x24, 0x00, 0x0A,
0x71, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x24, 0x00, 0x73, 0x02, 0x02, 0x02, 0x02, 0x0A,
0x00, 0x08, 0x01, 0x00, 0x60, 0x02, 0xFF, 0x08, 0x10, 0x08, 0x10, 0x24, 0x00, 0x7F, 0x18, 0x00,
0x16, 0x00, 0x16, 0x00, 0x18, 0x48, 0x00, 0x02, 0x4F, 0x0C, 0x0C, 0x0C, 0x0C, 0x24, 0x00, 0x31,
0x7F, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x00, 0x48, 0x00, 0x1F, 0x17,
0x48, 0x00, 0x10, 0x0F, 0x24, 0x00, 0x0D, 0x1F, 0x02, 0x68, 0x01, 0x0C, 0x1E, 0x0A, 0x68, 0x01,
0x0F, 0x44, 0x01, 0x20, 0x01, 0x83, 0x01, 0x65, 0x00, 0x12, 0x00, 0x21, 0x00, 0x22, 0x48, 0x00,
0x10, 0x01, 0x01, 0x00, 0x0F, 0xD4, 0x01, 0x1C, 0x04, 0x24, 0x00, 0x7F, 0x21, 0x00, 0x23, 0x00,
0x23, 0x00, 0x21, 0x24, 0x00, 0x00, 0x15, 0x03, 0x24, 0x00, 0x3F, 0x0F, 0x00, 0x04, 0x48, 0x00,
0x12, 0x3F, 0x21, 0x00, 0x24, 0x48, 0x00, 0x06, 0x0F, 0xD8, 0x00, 0x0E, 0x01, 0x01, 0x00, 0x11,
0x14, 0x66, 0x00, 0x33, 0x00, 0x00, 0x27, 0xD4, 0x02, 0x13, 0x50, 0xC4, 0x02, 0x10, 0x54, 0xF4,
0x00, 0x12, 0x04, 0x1C, 0x00, 0x13, 0x7F, 0x1C, 0x00, 0xEA, 0x74, 0x04, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x23, 0x00, 0x1C, 0x00, 0x22, 0xF8, 0x05, 0x1C, 0x00, 0x62,
0xFC, 0x05, 0x00, 0x00, 0x7C, 0x07, 0x5C, 0x00, 0xF1, 0x04, 0xE3, 0x07, 0xFF, 0xFF, 0xE0, 0x07,
0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0xB0, 0x07, 0x00, 0x00, 0xD8, 0x07, 0x00, 0x5D, 0x00, 0xF0,
0x06, 0x18, 0x08, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x5C, 0x08, 0x00,
0x00, 0x74, 0x08, 0x00, 0x00, 0x80, 0x18, 0x00, 0xF0, 0xB1, 0x0A, 0x00, 0x00, 0xB0, 0x0B, 0x00,
0x00, 0x48, 0x0D, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0x00, 0x78, 0x10, 0x00, 0x00, 0x10, 0x12, 0x00,
0x00, 0xA8, 0x13, 0x00, 0x00, 0x40, 0x15, 0x00, 0x00, 0x4C, 0x15, 0x00, 0x00, 0x54, 0x15, 0x00,
0x00, 0x94, 0x15, 0x00, 0x00, 0xBC, 0x15, 0x00, 0x00, 0x44, 0x16, 0x00, 0x00, 0xDC, 0x16, 0x00,
0x00, 0xC4, 0x17, 0x00, 0x00, 0x58, 0x18, 0x00, 0x00, 0x74, 0x18, 0x00, 0x00, 0xC0, 0x18, 0x00,
0x00, 0x20, 0x19, 0x00, 0x00, 0x54, 0x19, 0x00, 0x00, 0x94, 0x19, 0x00, 0x00, 0xB0, 0x19, 0x00,
0x00, 0xCC, 0x19, 0x00, 0x00, 0xE0, 0x19, 0x00, 0x00, 0x4C, 0x1A, 0x00, 0x00, 0xC4, 0x1A, 0x00,
0x00, 0x20, 0x1B, 0x00, 0x00, 0x98, 0x1B, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x98, 0x1C, 0x00,
0x00, 0x10, 0x1D, 0x00, 0x00, 0x98, 0x1D, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x00, 0x7C, 0x1E, 0x00,
0x00, 0xF4, 0x1E, 0x00, 0x00, 0x18, 0x1F, 0x00, 0x00, 0x44, 0x1F, 0x00, 0x00, 0x90, 0x1F, 0x00,
0x00, 0xC4, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x00, 0x94, 0x20, 0x00, 0x00, 0xAC, 0x21, 0x00,
0x00, 0x34, 0x22, 0x00, 0x00, 0xAC, 0x22, 0x00, 0x00, 0x34, 0x23, 0x00, 0x00, 0xAC, 0x23, 0x00,
0x00, 0x08, 0x24, 0x00, 0x00, 0x64, 0x24, 0x00, 0x00, 0xEC, 0x08, 0x00, 0xF2, 0xFF, 0xFF, 0x54,
0x25, 0x00, 0x00, 0x98, 0x25, 0x00, 0x00, 0xE8, 0x25, 0x00, 0x00, 0x60, 0x26, 0x00, 0x00, 0xBC,
0x26, 0x00, 0x00, 0x50, 0x27, 0x00, 0x00, 0xC8, 0x27, 0x00, 0x00, 0x50, 0x28, 0x00, 0x00, 0xC8,
0x28, 0x00, 0x00, 0x6C, 0x29, 0x00, 0x00, 0xE4, 0x29, 0x00, 0x00, 0x5C, 0x2A, 0x00, 0x00, 0xD4,
0x2A, 0x00, 0x00, 0x5C, 0x2B, 0x00, 0x00, 0xE4, 0x2B, 0x00, 0x00, 0x94, 0x2C, 0x00, 0x00, 0x1C,
0x2D, 0x00, 0x00, 0xA4, 0x2D, 0x00, 0x00, 0x10, 0x2E, 0x00, 0x00, 0x80, 0x2E, 0x00, 0x00, 0xEC,
0x2E, 0x00, 0x00, 0x4C, 0x2F, 0x00, 0x00, 0x84, 0x2F, 0x00, 0x00, 0x9C, 0x2F, 0x00, 0x00, 0xB8,
0x2F, 0x00, 0x00, 0x10, 0x30, 0x00, 0x00, 0x88, 0x30, 0x00, 0x00, 0xD8, 0x30, 0x00, 0x00, 0x50,
0x31, 0x00, 0x00, 0xA0, 0x31, 0x00, 0x00, 0xFC, 0x31, 0x00, 0x00, 0x84, 0x32, 0x00, 0x00, 0xFC,
0x32, 0x00, 0x00, 0x3C, 0x33, 0x00, 0x00, 0x9C, 0x33, 0x00, 0x00, 0x24, 0x34, 0x00, 0x00, 0x58,
0x34, 0x00, 0x00, 0xD8, 0x34, 0x00, 0x00, 0x30, 0x35, 0x00, 0x00, 0x80, 0x35, 0x00, 0x00, 0xF0,
0x35, 0x00, 0x00, 0x60, 0x36, 0x00, 0x00, 0xAC, 0x36, 0x00, 0x00, 0xFC, 0x36, 0x00, 0x00, 0x54,
0x37, 0x00, 0x00, 0xAC, 0x37, 0x00, 0x00, 0xFC, 0x37, 0x00, 0x00, 0x68, 0x38, 0x00, 0x00, 0xB8,
0x38, 0x00, 0x00, 0x1C, 0x39, 0x00, 0x00, 0x60, 0x39, 0x00, 0x00, 0xD0, 0x39, 0x00, 0x00, 0x0C,
0x3A, 0x00, 0x00, 0x7C, 0x3A, 0x00, 0x00, 0xA4, 0x3A, 0x00, 0x00, 0xF4, 0x3A, 0x00, 0x00, 0x00,
0x3B, 0x00, 0x00, 0x08, 0x3B, 0x00, 0x00, 0x10, 0x3B, 0x00, 0x00, 0x18, 0x3B, 0x00, 0x00, 0x20,
0x3B, 0x00, 0x00, 0x28, 0x3B, 0x00, 0x00, 0x30, 0x3B, 0x00, 0x00, 0x38, 0x3B, 0x00, 0x00, 0x40,
0x3B, 0x00, 0x00, 0x48, 0x3B, 0x00, 0x00, 0x50, 0x3B, 0x00, 0x00, 0x58, 0x3B, 0x00, 0x00, 0x2C,
0x40, 0x00, 0x00, 0x34, 0x40, 0x00, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x44, 0x40, 0x00, 0x00, 0x4C,
0x40, 0x00, 0x00, 0x54, 0x40, 0x00, 0x00, 0x5C, 0x40, 0x00, 0x00, 0x64, 0x40, 0x00, 0x00, 0x6C,
0x40, 0x00, 0x00, 0x74, 0x40, 0x00, 0x00, 0x7C, 0x40, 0x00, 0x00, 0x84, 0x40, 0x00, 0x00, 0x8C,
0x40, 0x00, 0x00, 0x94, 0x40, 0x00, 0x00, 0x9C, 0x40, 0x00, 0x00, 0xA4, 0x40, 0x00, 0x00, 0xAC,
0x40, 0x00, 0x00, 0xB4, 0x40, 0x00, 0x00, 0xBC, 0x40, 0x00, 0x00, 0xC4, 0x40, 0x00, 0x00, 0xCC,
0x40, 0x00, 0x00, 0xD4, 0x40, 0x00, 0x00, 0xDC, 0x40, 0x00, 0x00, 0xE4, 0x40, 0x00, 0x00, 0xEC,
0x40, 0x00, 0x00, 0xF4, 0x40, 0x00, 0x00, 0xFC, 0x40, 0x00, 0x00, 0x04, 0x41, 0x00, 0x00, 0x0C,
0x41, 0x00, 0x00, 0x14, 0x41, 0x00, 0x00, 0x1C, 0x41, 0x00, 0x00, 0x24, 0x41, 0x00, 0x00, 0x2C,
0x41, 0x00, 0x00, 0x34, 0x41, 0x00, 0x00, 0x3C, 0x41, 0x00, 0x00, 0x44, 0x41, 0x00, 0x00, 0x4C,
0x41, 0x00, 0x00, 0x54, 0x41, 0x00, 0x00, 0x5C, 0x41, 0x00, 0x00, 0x64, 0x41, 0x00, 0x00, 0x6C,
0x41, 0x00, 0x00, 0x74, 0x41, 0x00, 0x00, 0x7C, 0x41, 0x00, 0x00, 0x84, 0x41, 0x00, 0x00, 0x8C,
0x41, 0x00, 0x00, 0x94, 0x41, 0x00, 0x00, 0x9C, 0x41, 0x00, 0x00, 0xA4, 0x41, 0x00, 0x00, 0xAC,
0x41, 0x00, 0x00, 0xB4, 0x41, 0x00, 0x00, 0xBC, 0x41, 0x00, 0x00, 0xC4, 0x41, 0x00, 0x00, 0xCC,
0x41, 0x00, 0x00, 0xD4, 0x41, 0x00, 0x00, 0xDC, 0x41, 0x00, 0x00, 0xE4, 0x41, 0x00, 0x00, 0xEC,
0x41, 0x00, 0x00, 0xF4, 0x41, 0x00, 0x00, 0xFC, 0x41, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x0C,
0x42, 0x00, 0x00, 0x14, 0x42, 0x00, 0x00, 0x1C, 0x42, 0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x2C,
0x42, 0x00, 0x00, 0x34, 0x42, 0x00, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x44, 0x42, 0x00, 0x00, 0x4C,
0x42, 0x00, 0x00, 0x54, 0x42, 0x00, 0x00, 0x5C, 0x42, 0x00, 0x00, 0x64, 0x42, 0x00, 0x00, 0x6C,
0x42, 0x00, 0x00, 0x74, 0x42, 0x00, 0x00, 0x7C, 0x42, 0x00, 0x00, 0x84, 0x42, 0x00, 0x00, 0x8C,
0x42, 0x00, 0x00, 0x94, 0x42, 0x00, 0x00, 0x9C, 0x42, 0x00, 0x00, 0xA4, 0x42, 0x00, 0x00, 0xAC,
0x42, 0x00, 0x00, 0xB4, 0x42, 0x00, 0x00, 0xBC, 0x42, 0x00, 0x00, 0xC4, 0x42, 0x00, 0x00, 0xCC,
0x42, 0x78, 0x03, 0x22, 0xD4, 0x42, 0x78, 0x03, 0x2E, 0x14, 0x43, 0x6C, 0x07, 0x00, 0x18, 0x00,
0x17, 0x18, 0x18, 0x00, 0x00, 0x08, 0x05, 0x1F, 0x1C, 0x28, 0x00, 0x00, 0x00, 0x8F, 0x03, 0x17,
0x44, 0x18, 0x00, 0x00, 0xC4, 0x06, 0x1F, 0x60, 0x28, 0x00, 0x00, 0x00, 0x18, 0x00, 0x17, 0x6C,
0x18, 0x00, 0x31, 0x06, 0x00, 0xFF, 0x3E, 0x04, 0x57, 0x72, 0x00, 0xE0, 0x01, 0x2C, 0x0A, 0x07,
0x13, 0x04, 0x18, 0x00, 0x02, 0x14, 0x07, 0x11, 0x10, 0x38, 0x00, 0x20, 0x78, 0x43, 0x9A, 0x04,
0x02, 0x18, 0x00, 0x53, 0x52, 0x00, 0xE0, 0x01, 0x28, 0x30, 0x00, 0xF7, 0x00, 0x06, 0x00, 0xFE,
0xFF, 0x01, 0x00, 0x5A, 0x00, 0xB0, 0x00, 0x8C, 0x00, 0x28, 0x00, 0x13, 0x5C, 0x00, 0x5D, 0xFD,
0xFF, 0x02, 0x00, 0xFA, 0x18, 0x00, 0x13, 0x20, 0x08, 0x00, 0x00, 0x9C, 0x04, 0x01, 0xB5, 0x05,
0x09, 0xA1, 0x00, 0x00, 0x01, 0x00, 0x22, 0x06, 0x06, 0x16, 0x06, 0x01, 0x11, 0x00, 0x45, 0x06,
0x06, 0x06, 0x0A, 0x01, 0x00, 0x03, 0x12, 0x00, 0x63, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x17, 0x01,
0x00, 0x01, 0x13, 0x00, 0x83, 0x0A, 0x10, 0x17, 0x1B, 0x1E, 0x21, 0x21, 0x28, 0x01, 0x00, 0x02,
0x13, 0x00, 0x1B, 0x1B, 0xFE, 0x00, 0x00, 0x13, 0x00, 0x1B, 0x28, 0x70, 0x00, 0x00, 0x13, 0x00,
0x1C, 0x39, 0x27, 0x00, 0x4B, 0x17, 0x21, 0x36, 0x4E, 0x14, 0x00, 0x5A, 0x10, 0x1B, 0x2C, 0x44,
0x5F, 0x3B, 0x00, 0x6C, 0x06, 0x10, 0x1E, 0x32, 0x4E, 0x70, 0x4F, 0x00, 0x4C, 0x21, 0x39, 0x58,
0x7A, 0x76, 0x00, 0x4C, 0x21, 0x3D, 0x5F, 0x84, 0x63, 0x00, 0x4D, 0x28, 0x40, 0x5F, 0x8B, 0x14,
0x00, 0x2F, 0x44, 0x66, 0x14, 0x00, 0x15, 0x1F, 0x8E, 0x14, 0x00, 0x4A, 0x04, 0x98, 0x01, 0x1F,
0x06, 0x01, 0x00, 0x00, 0x1F, 0x0A, 0x01, 0x00, 0x00, 0x1F, 0x17, 0x01, 0x00, 0x00, 0x1F, 0x28,
0x01, 0x00, 0x00, 0x1F, 0x00, 0x01, 0x00, 0xFF, 0x2D, 0x0A, 0x98, 0x01, 0x01, 0x2D, 0x03, 0x06,
0x1C, 0x04, 0x05, 0x01, 0x00, 0x00, 0x1B, 0x00, 0x02, 0x14, 0x00, 0x04, 0x8C, 0x01, 0x00, 0x30,
0x03, 0x13, 0x0A, 0x16, 0x00, 0x04, 0x8C, 0x01, 0x9C, 0x21, 0x21, 0x1E, 0x1B, 0x17, 0x10, 0x0A,
0x06, 0x03, 0x65, 0x00, 0x1F, 0x1B, 0x15, 0x00, 0x00, 0x10, 0x28, 0x15, 0x00, 0x0B, 0x14, 0x00,
0x10, 0x39, 0x15, 0x00, 0x0B, 0x29, 0x00, 0x4C, 0x4E, 0x36, 0x21, 0x17, 0x29, 0x00, 0x5B, 0x5F,
0x44, 0x2C, 0x1B, 0x10, 0x14, 0x00, 0x5B, 0x70, 0x4E, 0x32, 0x1E, 0x10, 0x66, 0x00, 0x4C, 0x7A,
0x58, 0x39, 0x21, 0x51, 0x00, 0x4C, 0x84, 0x5F, 0x3D, 0x21, 0x7A, 0x00, 0x4C, 0x8B, 0x5F, 0x40,
0x28, 0x65, 0x00, 0x3F, 0x8B, 0x66, 0x44, 0x14, 0x00, 0x12, 0x1F, 0x8E, 0x14, 0x00, 0x43, 0x05,
0x98, 0x01, 0x0E, 0x9C, 0x03, 0x0F, 0x14, 0x00, 0xFF, 0x6B, 0x0D, 0x60, 0x06, 0x0E, 0x04, 0x02,
0x0F, 0x14, 0x00, 0xFF, 0x63, 0x0F, 0x30, 0x03, 0x5F, 0x0F, 0x58, 0x07, 0x13, 0x0E, 0x94, 0x07,
0x01, 0xBC, 0x07, 0x1F, 0xF8, 0xE4, 0x07, 0x00, 0x2E, 0xC5, 0xFB, 0x0C, 0x08, 0x81, 0x8E, 0xB0,
0xC8, 0xDD, 0xEA, 0xF4, 0xF4, 0xFB, 0x01, 0x00, 0x03, 0x34, 0x08, 0x81, 0x7A, 0x99, 0xAD, 0xBE,
0xCC, 0xD2, 0xD6, 0xDD, 0x01, 0x00, 0x03, 0x5C, 0x08, 0x72, 0x66, 0x7A, 0x8E, 0x9F, 0xAA, 0xB0,
0xB4, 0x01, 0x00, 0x03, 0x84, 0x08, 0xD3, 0x4E, 0x5F, 0x70, 0x7A, 0x84, 0x88, 0x8B, 0x8B, 0x8B,
0x8E, 0x8E, 0x8E, 0x8E, 0xAC, 0x08, 0x72, 0x36, 0x44, 0x4E, 0x58, 0x5F, 0x5F, 0x66, 0x01, 0x00,
0x03, 0xD4, 0x08, 0x72, 0x21, 0x2C, 0x32, 0x39, 0x3D, 0x40, 0x44, 0x01, 0x00, 0x0F, 0xFC, 0x08,
0x03, 0x0C, 0x24, 0x09, 0x2D, 0x1B, 0x1B, 0x4C, 0x09, 0x3C, 0x0D, 0x0D, 0x0D, 0x74, 0x09, 0x00,
0x17, 0x00, 0x0E, 0x30, 0x03, 0x0F, 0x30, 0x07, 0xAB, 0x1F, 0xFB, 0x01, 0x00, 0x00, 0x1F, 0xDD,
0x01, 0x00, 0x00, 0x1F, 0xB4, 0x01, 0x00, 0x00, 0x1F, 0x8E, 0x01, 0x00, 0x00, 0x1F, 0x66, 0x01,
0x00, 0x00, 0x1F, 0x44, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x08, 0x01, 0x1F, 0x1B, 0x01, 0x00, 0x00,
0x1F, 0x0D, 0x01, 0x00, 0x00, 0x0F, 0x60, 0x09, 0x01, 0x0F, 0xC8, 0x04, 0x66, 0x0F, 0x58, 0x07,
0x15, 0x0F, 0x94, 0x07, 0x00, 0x1E, 0xF8, 0xBC, 0x07, 0x23, 0xFB, 0xC5, 0xE4, 0x07, 0x02, 0x8A,
0x01, 0x73, 0xF4, 0xF4, 0xEA, 0xDD, 0xC8, 0xB0, 0x8E, 0x0C, 0x08, 0x02, 0x8A, 0x01, 0x73, 0xD6,
0xD2, 0xCC, 0xBE, 0xAD, 0x99, 0x7A, 0x34, 0x08, 0x03, 0x8B, 0x01, 0x63, 0xB0, 0xAA, 0x9F, 0x8E,
0x7A, 0x66, 0x5C, 0x08, 0x00, 0x88, 0x01, 0x93, 0x8B, 0x8B, 0x8B, 0x88, 0x84, 0x7A, 0x70, 0x5F,
0x4E, 0x84, 0x08, 0x03, 0x8B, 0x01, 0x63, 0x5F, 0x5F, 0x58, 0x4E, 0x44, 0x36, 0xAC, 0x08, 0x03,
0x8B, 0x01, 0x63, 0x40, 0x3D, 0x39, 0x32, 0x2C, 0x21, 0xD4, 0x08, 0x0F, 0xFC, 0x08, 0x01, 0x1F,
0x1B, 0x24, 0x09, 0x00, 0x2E, 0x0D, 0x0D, 0x4C, 0x09, 0x03, 0x0D, 0x00, 0x09, 0x74, 0x09, 0x04,
0xCC, 0x0C, 0x11, 0x60, 0x34, 0x0D, 0x03, 0x3C, 0x0D, 0x22, 0x04, 0x0E, 0x33, 0x09, 0xF0, 0x2C,
0xFC, 0xFC, 0x17, 0x18, 0xFF, 0xFF, 0x05, 0x08, 0xFF, 0xF2, 0x00, 0x00, 0xF8, 0xDF, 0x00, 0x00,
0xE7, 0xCD, 0x00, 0x00, 0xD7, 0xBA, 0x00, 0x00, 0xC7, 0xA8, 0x00, 0x00, 0xB6, 0x95, 0x00, 0x00,
0xA6, 0x82, 0x00, 0x00, 0x95, 0x70, 0x00, 0x00, 0x85, 0x5D, 0x00, 0x00, 0x02, 0x02, 0x00, 0x23,
0x9C, 0x9C, 0x05, 0x38, 0xFF, 0xFF, 0x08, 0x06, 0x05, 0x06, 0x01, 0x1C, 0x0D, 0xF0, 0x0D, 0xF5,
0xF1, 0x22, 0xFC, 0xCB, 0xF8, 0xCA, 0x20, 0xFF, 0xA1, 0xF8, 0x9E, 0x20, 0xFF, 0x75, 0xF8, 0x72,
0x20, 0xFF, 0x48, 0xF8, 0x46, 0x20, 0xFF, 0x1B, 0x04, 0x01, 0x01, 0x70, 0x15, 0x33, 0x09, 0x09,
0x0E, 0x72, 0x00, 0xF2, 0x39, 0x6C, 0xFC, 0x7D, 0x1E, 0xFC, 0xC8, 0x00, 0x00, 0x00, 0x8F, 0xFF,
0x5C, 0x41, 0xFF, 0xA8, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0x39, 0x64, 0xFF, 0x85, 0x00, 0x00, 0x00,
0xD3, 0xFF, 0x16, 0x87, 0xFF, 0x62, 0x00, 0x56, 0xFC, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0x0B,
0x3A, 0xB5, 0xFF, 0xE7, 0xA4, 0xF4, 0xFF, 0xA8, 0x06, 0x00, 0x42, 0xFF, 0xA4, 0x01, 0xF3, 0xF4,
0x01, 0x00, 0x39, 0xBE, 0xFF, 0xD4, 0x9F, 0xFF, 0xF3, 0x9C, 0x05, 0x5F, 0xFF, 0x01, 0x00, 0xF1,
0x1D, 0x05, 0x02, 0xA9, 0xFF, 0x43, 0x5B, 0xFF, 0x8F, 0x04, 0x01, 0x00, 0xC7, 0xFF, 0x20, 0x78,
0xFF, 0x6D, 0x00, 0x00, 0x00, 0xE7, 0xFC, 0x04, 0x98, 0xFF, 0x4E, 0x00, 0x00, 0x08, 0xFF, 0xE0,
0x00, 0xB8, 0xFF, 0x2F, 0x00, 0x00, 0x25, 0xFF, 0xC0, 0x00, 0xD8, 0xFF, 0x10, 0xC8, 0x0D, 0x42,
0x08, 0x12, 0x00, 0xFE, 0x89, 0x00, 0x22, 0x18, 0x44, 0x08, 0x00, 0x11, 0x30, 0x82, 0x05, 0xF0,
0x14, 0x30, 0xBC, 0xF7, 0xFF, 0xD4, 0x43, 0x00, 0x0F, 0xEB, 0xFF, 0xCD, 0xC1, 0xFF, 0xF2, 0x13,
0x58, 0xFF, 0xF4, 0x07, 0x01, 0xD5, 0xFF, 0x62, 0x71, 0xFF, 0xF5, 0x05, 0x00, 0x9A, 0xCB, 0x56,
0x52, 0xFF, 0xFF, 0x87, 0x27, 0x00, 0x50, 0x0C, 0xE6, 0xFF, 0xFF, 0x8C, 0x23, 0x13, 0x50, 0x39,
0xF4, 0xFF, 0xFF, 0xA7, 0xFC, 0x12, 0x50, 0x34, 0xE9, 0xFF, 0xFF, 0x9F, 0x1B, 0x00, 0xF1, 0x1D,
0x23, 0xDD, 0xFF, 0xFF, 0x49, 0x05, 0x32, 0x47, 0x00, 0x23, 0xF6, 0xFF, 0xA8, 0x6F, 0xFF, 0xD3,
0x00, 0x00, 0xAD, 0xFF, 0xC8, 0x3C, 0xFF, 0xFD, 0x21, 0x00, 0xB0, 0xFF, 0xAC, 0x03, 0xD1, 0xFF,
0xE2, 0xAD, 0xFE, 0xFF, 0x4C, 0x00, 0x1C, 0xAD, 0xF2, 0xFF, 0xE4, 0x63, 0x79, 0x00, 0x13, 0xB7,
0xC3, 0x0E, 0x63, 0x5A, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x01, 0xA1, 0x43, 0xD0, 0xF9, 0xE3,
0x81, 0x02, 0x00, 0x00, 0xC8, 0xD6, 0x0F, 0x00, 0xB1, 0x09, 0xEE, 0xFF, 0xB3, 0xEB, 0xFF, 0x54,
0x00, 0x14, 0xFE, 0x92, 0x10, 0x00, 0xB1, 0x3B, 0xFF, 0xC4, 0x00, 0x6C, 0xFF, 0x99, 0x00, 0x59,
0xFF, 0x4B, 0x10, 0x00, 0xB7, 0x52, 0xFF, 0xB1, 0x00, 0x56, 0xFF, 0xAF, 0x00, 0xA0, 0xF9, 0x0B,
0x10, 0x00, 0x43, 0xAE, 0x01, 0xE6, 0xBD, 0xF7, 0x0A, 0x92, 0xFF, 0xC9, 0x00, 0x72, 0xFF, 0x96,
0x2E, 0xFF, 0x75, 0x10, 0x00, 0xF1, 0x11, 0x07, 0xEA, 0xFF, 0xAE, 0xEC, 0xFF, 0x4E, 0x75, 0xFF,
0x2E, 0x0A, 0x68, 0x97, 0x89, 0x37, 0x00, 0x00, 0x3F, 0xD3, 0xFF, 0xEC, 0x82, 0x01, 0xBC, 0xE6,
0x01, 0xB5, 0xFF, 0xFF, 0xFF, 0xFE, 0x41, 0x4B, 0x14, 0xB2, 0x00, 0x0B, 0xF9, 0xA0, 0x16, 0xFF,
0xEB, 0x19, 0x7C, 0xFF, 0xA0, 0x36, 0x00, 0xA2, 0x4A, 0xFF, 0x58, 0x38, 0xFF, 0xC6, 0x00, 0x43,
0xFF, 0xC1, 0x10, 0x00, 0xA2, 0x91, 0xFE, 0x13, 0x3B, 0xFF, 0xC5, 0x00, 0x41, 0xFF, 0xC3, 0x10,
0x00, 0xA1, 0xD8, 0xCA, 0x00, 0x26, 0xFF, 0xDB, 0x01, 0x55, 0xFF, 0xAF, 0x0F, 0x00, 0xB1, 0x1F,
0xFF, 0x83, 0x00, 0x02, 0xE0, 0xFF, 0xB2, 0xE1, 0xFF, 0x69, 0x10, 0x00, 0xD4, 0x65, 0xFF, 0x3C,
0x00, 0x00, 0x36, 0xC7, 0xFA, 0xEB, 0x92, 0x05, 0x0A, 0x0A, 0x08, 0x02, 0x52, 0x63, 0xDC, 0xF7,
0xBF, 0x38, 0xA3, 0x00, 0x51, 0xF6, 0xB5, 0xFF, 0xEF, 0x0C, 0x12, 0x02, 0xF0, 0x00, 0x8C, 0x00,
0xCA, 0xFF, 0x48, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x87, 0x01, 0xE3, 0xFF, 0x36, 0x11, 0x14, 0x50,
0xFF, 0xBE, 0x36, 0xFF, 0xD9, 0x72, 0x01, 0x61, 0x05, 0xDC, 0xFC, 0xC2, 0xFD, 0x40, 0x3C, 0x00,
0x42, 0x64, 0xFF, 0xFF, 0x64, 0xE7, 0x02, 0xF2, 0x37, 0xD2, 0xFF, 0xFE, 0x31, 0x00, 0x9A, 0xB8,
0x17, 0x00, 0x8A, 0xFF, 0xCA, 0xFF, 0xC6, 0x04, 0xF4, 0xFE, 0x09, 0x02, 0xEE, 0xFF, 0x28, 0xB7,
0xFF, 0x8B, 0xFF, 0xCA, 0x00, 0x21, 0xFF, 0xF4, 0x01, 0x29, 0xFC, 0xFF, 0xFF, 0x67, 0x00, 0x16,
0xFF, 0xFB, 0x0C, 0x02, 0xC3, 0xFF, 0xFF, 0x48, 0x03, 0x00, 0xBC, 0xFF, 0xC8, 0xCB, 0xFF, 0xF1,
0xFF, 0xFF, 0x30, 0x00, 0x1B, 0xAF, 0xF7, 0xF0, 0xA8, 0x17, 0x7E, 0xF6, 0x30, 0x05, 0x03, 0xC4,
0x02, 0xF1, 0x01, 0xD9, 0xFC, 0x0D, 0xDC, 0xE3, 0x00, 0xDC, 0xBB, 0x00, 0xDC, 0x92, 0x00, 0xDC,
0x69, 0x00, 0x04, 0x75, 0x00, 0x41, 0x04, 0x11, 0x01, 0xFD, 0x68, 0x0C, 0xF1, 0x12, 0xAD, 0xD4,
0x02, 0xCD, 0xFF, 0xB3, 0x42, 0xFF, 0xE0, 0x05, 0x88, 0xFF, 0x97, 0x00, 0xAF, 0xFF, 0x77, 0x00,
0xC6, 0xFF, 0x63, 0x00, 0xD6, 0xFF, 0x59, 0x00, 0xDB, 0xFF, 0x55, 0x00, 0xDC, 0xFF, 0x54, 0x04,
0x00, 0xF0, 0x11, 0xD6, 0xFF, 0x58, 0x00, 0xC7, 0xFF, 0x61, 0x00, 0xB0, 0xFF, 0x75, 0x00, 0x8A,
0xFF, 0x98, 0x00, 0x42, 0xFF, 0xDF, 0x05, 0x02, 0xCF, 0xFF, 0xB0, 0x00, 0x1D, 0xB1, 0xD7, 0x05,
0x05, 0x11, 0x00, 0x4C, 0x00, 0xF0, 0x18, 0x71, 0xD5, 0x52, 0x00, 0x00, 0x50, 0xF8, 0xFE, 0x39,
0x00, 0x00, 0x7A, 0xFF, 0xA7, 0x00, 0x00, 0x30, 0xFF, 0xED, 0x01, 0x00, 0x0D, 0xFF, 0xFF, 0x17,
0x00, 0x01, 0xFB, 0xFF, 0x2D, 0x00, 0x00, 0xF0, 0xFF, 0x3A, 0x00, 0x00, 0xED, 0xFF, 0xE6, 0x11,
0x20, 0xFF, 0x44, 0x0A, 0x00, 0x12, 0x42, 0x14, 0x00, 0x60, 0x01, 0xFA, 0xFF, 0x2E, 0x00, 0x0C,
0x28, 0x00, 0xA0, 0x32, 0xFF, 0xEE, 0x01, 0x00, 0x7C, 0xFF, 0xA7, 0x00, 0x4F, 0x46, 0x00, 0x32,
0x73, 0xD9, 0x54, 0xDC, 0x01, 0x42, 0x07, 0x06, 0x00, 0x08, 0xDB, 0x02, 0xF0, 0x18, 0xFC, 0x89,
0x00, 0x00, 0x01, 0x8E, 0x2B, 0xFC, 0x78, 0x72, 0x3D, 0x19, 0xE6, 0xFD, 0xFE, 0xFA, 0xFE, 0x78,
0x00, 0x04, 0xA1, 0xFF, 0xF6, 0x26, 0x00, 0x00, 0x2C, 0xF8, 0x8F, 0xF6, 0x98, 0x00, 0x00, 0x36,
0xC4, 0x0F, 0x87, 0x84, 0x02, 0x34, 0x00, 0x33, 0x08, 0x00, 0x03, 0x02, 0x04, 0x11, 0x7B, 0x07,
0x00, 0xC1, 0xFF, 0x7C, 0x00, 0x00, 0x58, 0x9C, 0xAC, 0xFF, 0xCD, 0x9C, 0x95, 0x90, 0x63, 0x03,
0x83, 0xF4, 0x03, 0x04, 0x2C, 0xFF, 0x7F, 0x04, 0x04, 0x1C, 0x00, 0x05, 0x07, 0x00, 0x10, 0x01,
0x21, 0x01, 0x31, 0x04, 0x03, 0x06, 0xD4, 0x00, 0xF1, 0x02, 0x0C, 0x24, 0x23, 0x54, 0xFF, 0xF4,
0x54, 0xFF, 0xF4, 0x00, 0x3A, 0xE0, 0x16, 0xE1, 0x6E, 0x02, 0x2C, 0xF8, 0x0D, 0x11, 0x03, 0x68,
0x04, 0x70, 0x08, 0x9C, 0x9C, 0x9C, 0x9C, 0x0A, 0x0C, 0x4C, 0x00, 0x50, 0x10, 0x01, 0x04, 0x04,
0x04, 0x10, 0x04, 0x22, 0x04, 0x04, 0x76, 0x00, 0x40, 0x08, 0x24, 0x24, 0x02, 0x48, 0x04, 0x00,
0x04, 0x00, 0x35, 0x07, 0x07, 0x0E, 0xAC, 0x04, 0x20, 0xA1, 0xF2, 0xCA, 0x00, 0x30, 0x02, 0xEA,
0xB6, 0x0D, 0x00, 0x30, 0x32, 0xFF, 0x6E, 0x07, 0x00, 0x20, 0x79, 0xFF, 0x2E, 0x16, 0x30, 0x00,
0xC0, 0xDF, 0x38, 0x03, 0x21, 0x0D, 0xFB, 0xFB, 0x19, 0x30, 0x4F, 0xFF, 0x50, 0x07, 0x00, 0x21,
0x96, 0xFB, 0x3B, 0x00, 0x11, 0xDD, 0xA0, 0x02, 0x21, 0x24, 0xFF, 0xD4, 0x10, 0x30, 0x6C, 0xFF,
0x32, 0x07, 0x00, 0x20, 0xB3, 0xEA, 0xC8, 0x01, 0x30, 0x06, 0xF4, 0xA3, 0x0D, 0x00, 0x32, 0x41,
0xFF, 0x5C, 0x60, 0x00, 0x23, 0x09, 0x08, 0x6C, 0x00, 0xFF, 0x18, 0x09, 0x8D, 0xE6, 0xF9, 0xD2,
0x59, 0x00, 0x00, 0x9B, 0xFF, 0xEB, 0xB2, 0xFE, 0xFF, 0x48, 0x0B, 0xFA, 0xFF, 0x52, 0x00, 0xA6,
0xFF, 0xB7, 0x34, 0xFF, 0xFF, 0x27, 0x00, 0x7C, 0xFF, 0xE3, 0x3C, 0xFF, 0xFF, 0x24, 0x00, 0x78,
0xFF, 0xEC, 0x08, 0x00, 0x15, 0xF2, 0x14, 0x35, 0xFF, 0xFF, 0x29, 0x00, 0x7D, 0xFF, 0xE4, 0x0E,
0xFB, 0xFF, 0x57, 0x00, 0xAB, 0xFF, 0xB8, 0x00, 0x99, 0xFF, 0xEB, 0xAF, 0xFE, 0xFF, 0x4A, 0x00,
0x09, 0x8E, 0xE9, 0xFD, 0xD5, 0x5C, 0x00, 0x09, 0x06, 0x0E, 0xF6, 0x03, 0xFF, 0x0A, 0x05, 0x6B,
0xF6, 0xFC, 0x0C, 0x4C, 0xDC, 0xFF, 0xFF, 0xFF, 0x0C, 0x88, 0xFD, 0xE1, 0xFF, 0xFF, 0x0C, 0x21,
0x0F, 0x50, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x27, 0x05, 0xD4, 0x00, 0xF1, 0x18, 0x06,
0x85, 0xE1, 0xFA, 0xDB, 0x74, 0x02, 0x00, 0x89, 0xFF, 0xF6, 0xB1, 0xF9, 0xFF, 0x6D, 0x02, 0xF0,
0xFF, 0x70, 0x00, 0x87, 0xFF, 0xCE, 0x1C, 0xFF, 0xFF, 0x39, 0x00, 0x64, 0xFF, 0xF3, 0x17, 0xA0,
0xA0, 0x1E, 0x00, 0x8B, 0xFF, 0xE9, 0xD0, 0x04, 0x30, 0xEA, 0xFF, 0xAA, 0x08, 0x00, 0x30, 0x8C,
0xFF, 0xFF, 0x8D, 0x03, 0x40, 0x2B, 0xFB, 0xFF, 0x9D, 0xDB, 0x01, 0x30, 0xC0, 0xFF, 0xE7, 0x2F,
0x05, 0x30, 0x5A, 0xFF, 0xFF, 0x5B, 0x02, 0x51, 0x0F, 0xE7, 0xFF, 0xB0, 0x01, 0xA0, 0x03, 0x10,
0xF2, 0x9D, 0x09, 0x92, 0x23, 0xFC, 0xFF, 0xD9, 0x9C, 0x9C, 0x9C, 0x60, 0x3C, 0x83, 0x05, 0x15,
0x9C, 0x78, 0x00, 0xF0, 0x17, 0x10, 0x98, 0xE9, 0xF8, 0xD1, 0x5B, 0x00, 0x00, 0xB8, 0xFF, 0xE4,
0xB5, 0xFE, 0xFF, 0x4F, 0x25, 0xFF, 0xFF, 0x3A, 0x00, 0xA7, 0xFF, 0xB8, 0x4C, 0xFF, 0xFF, 0x11,
0x00, 0x7D, 0xFF, 0xDC, 0x25, 0x74, 0x74, 0x06, 0x00, 0x8A, 0xFF, 0xFC, 0x05, 0x31, 0x00, 0x1C,
0xD8, 0x92, 0x04, 0x40, 0x6B, 0xFF, 0xFF, 0x94, 0x09, 0x02, 0x51, 0x46, 0xC6, 0xFF, 0xEA, 0x2A,
0x55, 0x02, 0xC0, 0xBA, 0xFF, 0xA4, 0x1D, 0x5C, 0x5C, 0x05, 0x00, 0x80, 0xFF, 0xD8, 0x4A, 0xEB,
0x02, 0xF7, 0x0B, 0x80, 0xFF, 0xD8, 0x21, 0xFF, 0xFF, 0x61, 0x06, 0xC0, 0xFF, 0xAA, 0x00, 0xC2,
0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x4B, 0x00, 0x17, 0xA4, 0xEE, 0xFD, 0xD7, 0x63, 0x54, 0x06, 0x51,
0x00, 0x1D, 0xFA, 0xFC, 0xDD, 0x09, 0x00, 0x41, 0x7F, 0xFF, 0xFF, 0xE0, 0x27, 0x0A, 0x13, 0xE3,
0x09, 0x00, 0x32, 0x4B, 0xFF, 0xC7, 0x09, 0x00, 0x31, 0xB0, 0xFF, 0x75, 0x09, 0x00, 0x41, 0x1A,
0xFC, 0xC8, 0x58, 0x09, 0x00, 0x31, 0x7B, 0xFF, 0x75, 0x09, 0x00, 0x41, 0x02, 0xE0, 0xFF, 0x22,
0x09, 0x00, 0x41, 0x45, 0xFF, 0xCF, 0x00, 0x09, 0x00, 0xC2, 0x64, 0xFF, 0xFF, 0xFC, 0xFE, 0xFF,
0xFF, 0xFC, 0x4B, 0x63, 0xFC, 0xFC, 0x09, 0x00, 0x00, 0x41, 0x00, 0x02, 0x36, 0x00, 0x0F, 0x09,
0x00, 0x00, 0x05, 0x00, 0x01, 0x20, 0xDB, 0xFC, 0x01, 0x00, 0xC2, 0x63, 0x00, 0xE2, 0xFF, 0xB2,
0xA4, 0xA4, 0xA4, 0x41, 0x00, 0xE6, 0xFF, 0x73, 0x07, 0x31, 0xE9, 0xFF, 0x17, 0x08, 0x00, 0x22,
0xED, 0xFF, 0x29, 0x00, 0xF3, 0x08, 0xF0, 0xFF, 0xAB, 0xF3, 0xEA, 0x89, 0x03, 0x00, 0xF4, 0xFF,
0xEB, 0xB0, 0xFB, 0xFF, 0x69, 0x00, 0xD0, 0xD8, 0x36, 0x00, 0x8F, 0xFF, 0xC2, 0xDB, 0x04, 0x11,
0xE4, 0x08, 0x00, 0xF6, 0x13, 0x5E, 0xFF, 0xE9, 0x26, 0xFC, 0xFC, 0x27, 0x00, 0x64, 0xFF, 0xD8,
0x0D, 0xFE, 0xFF, 0x4F, 0x00, 0x8A, 0xFF, 0xA8, 0x00, 0xB5, 0xFF, 0xE7, 0xA8, 0xF8, 0xFF, 0x44,
0x00, 0x18, 0xAE, 0xF0, 0xFD, 0xD9, 0x61, 0x00, 0x01, 0xE0, 0x02, 0x76, 0xDF, 0xF9, 0xDD, 0x82,
0x04, 0x00, 0x00, 0x6A, 0xFF, 0xF9, 0xAF, 0xF4, 0x9E, 0x03, 0xF2, 0x07, 0xD8, 0xFF, 0x7B, 0x00,
0x7A, 0xFF, 0xD5, 0x00, 0x0F, 0xFF, 0xFF, 0x4C, 0x00, 0x31, 0x88, 0x7F, 0x00, 0x22, 0xFF, 0xFF,
0x3D, 0x00, 0x1D, 0x03, 0x51, 0xFF, 0x5F, 0x89, 0x92, 0x44, 0x09, 0x00, 0x50, 0xFC, 0xFF, 0xFF,
0xFF, 0x5A, 0x09, 0x00, 0x50, 0x93, 0x10, 0xAF, 0xFF, 0xCD, 0x09, 0x00, 0x70, 0x3C, 0x00, 0x5D,
0xFF, 0xFC, 0x03, 0x23, 0x09, 0x00, 0xF0, 0x04, 0x52, 0xFF, 0xFF, 0x09, 0x13, 0xFF, 0xFF, 0x42,
0x00, 0x57, 0xFF, 0xF6, 0x01, 0x00, 0xDB, 0xFF, 0x74, 0x00, 0x86, 0xFF, 0x05, 0x50, 0x68, 0xFF,
0xF5, 0xA9, 0xF7, 0x16, 0x02, 0x51, 0x01, 0x73, 0xE1, 0xFD, 0xDD, 0xE0, 0x05, 0x13, 0x09, 0xB8,
0x03, 0x11, 0x53, 0xFF, 0x00, 0x80, 0x9E, 0x36, 0xA4, 0xA4, 0xA4, 0xE8, 0xFF, 0x91, 0x12, 0x00,
0x11, 0xE1, 0x6F, 0x03, 0x40, 0x19, 0xFF, 0xFF, 0x26, 0xE3, 0x19, 0x00, 0xB5, 0x04, 0x50, 0x00,
0x00, 0x88, 0xFF, 0xB8, 0x1B, 0x00, 0x30, 0xBF, 0xFF, 0x82, 0x7F, 0x08, 0x11, 0xF4, 0xC8, 0x06,
0xA0, 0x2F, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x66, 0xFF, 0xDE, 0x1B, 0x00, 0x10, 0x9E, 0x15,
0x05, 0x40, 0x00, 0x00, 0xD6, 0xFF, 0xAF, 0x14, 0x10, 0x10, 0x45, 0x02, 0x00, 0x9C, 0x01, 0x29,
0xFB, 0x09, 0x6C, 0x01, 0x60, 0x0C, 0x95, 0xE9, 0xF8, 0xCB, 0x44, 0x2D, 0x00, 0xF0, 0x1D, 0xE9,
0xBE, 0xFF, 0xF9, 0x22, 0x06, 0xF6, 0xFF, 0x4B, 0x01, 0xD1, 0xFF, 0x77, 0x1C, 0xFF, 0xFF, 0x23,
0x00, 0xA7, 0xFF, 0x98, 0x0C, 0xFE, 0xFF, 0x33, 0x00, 0xB6, 0xFF, 0x86, 0x00, 0xB9, 0xFF, 0x8B,
0x1A, 0xF1, 0xFF, 0x39, 0x00, 0x20, 0xF1, 0xFF, 0xFF, 0xFF, 0x92, 0x7F, 0x00, 0xF0, 0x0F, 0xE7,
0xB9, 0xFF, 0xE8, 0x1F, 0x1A, 0xFD, 0xFF, 0x36, 0x00, 0xB5, 0xFF, 0x97, 0x4C, 0xFF, 0xFB, 0x03,
0x00, 0x7D, 0xFF, 0xCF, 0x4D, 0xFF, 0xF8, 0x01, 0x00, 0x7A, 0xFF, 0xD1, 0x28, 0xAC, 0x00, 0xF6,
0x03, 0xA8, 0xFF, 0xAB, 0x01, 0xC2, 0xFF, 0xDC, 0xAE, 0xFF, 0xFF, 0x48, 0x00, 0x16, 0xA4, 0xEF,
0xFC, 0xD4, 0x5D, 0x78, 0x00, 0x60, 0x05, 0x8A, 0xE5, 0xF8, 0xCA, 0x44, 0x0C, 0x03, 0xF0, 0x0A,
0xEA, 0xB9, 0xFF, 0xFB, 0x2E, 0x0A, 0xF6, 0xFF, 0x52, 0x00, 0xB8, 0xFF, 0x9D, 0x34, 0xFF, 0xFF,
0x20, 0x00, 0x84, 0xFF, 0xD2, 0x46, 0xFF, 0xFF, 0x19, 0x38, 0x04, 0x10, 0x3E, 0x10, 0x04, 0xD0,
0x7C, 0xFF, 0xE4, 0x13, 0xFD, 0xFF, 0x72, 0x0F, 0xBD, 0xFF, 0xE4, 0x00, 0x9C, 0x5F, 0x07, 0x83,
0xFF, 0xE4, 0x00, 0x05, 0x69, 0x9F, 0x81, 0x8E, 0xE4, 0x01, 0xF1, 0x17, 0x7E, 0xFF, 0xE1, 0x1A,
0xA0, 0xA0, 0x14, 0x00, 0x8F, 0xFF, 0xCD, 0x10, 0xFE, 0xFF, 0x4C, 0x04, 0xCA, 0xFF, 0x99, 0x00,
0xB6, 0xFF, 0xFB, 0xE8, 0xFF, 0xFC, 0x31, 0x00, 0x14, 0xA1, 0xEC, 0xFC, 0xD4, 0x50, 0x00, 0x04,
0x03, 0x09, 0x30, 0x04, 0x95, 0x95, 0x9C, 0x2C, 0xF4, 0xFF, 0x48, 0x04, 0x04, 0x02, 0x22, 0x05,
0x06, 0x12, 0x00, 0x40, 0x04, 0x03, 0x0C, 0x01, 0xD4, 0x08, 0x86, 0xF5, 0xFC, 0x47, 0xF8, 0xFF,
0x48, 0x2B, 0x2C, 0x2D, 0x0D, 0xF6, 0x06, 0x23, 0x24, 0x0C, 0xF8, 0xFF, 0x54, 0xF8, 0xFF, 0x54,
0x07, 0xDB, 0x42, 0xA9, 0xCC, 0x08, 0x15, 0x02, 0x00, 0x07, 0x06, 0x0B, 0xE2, 0x0A, 0x00, 0xBF,
0x08, 0xF0, 0x1E, 0x01, 0x66, 0x89, 0x00, 0x00, 0x16, 0xB2, 0xFF, 0x94, 0x00, 0x4B, 0xE9, 0xFF,
0xC8, 0x23, 0x5F, 0xFF, 0xFD, 0x82, 0x05, 0x00, 0x7C, 0xFF, 0x94, 0x01, 0x00, 0x00, 0x4F, 0xFA,
0xFF, 0xA8, 0x10, 0x00, 0x00, 0x30, 0xD4, 0xFF, 0xE0, 0x37, 0x00, 0x00, 0x09, 0x90, 0xFF, 0x94,
0x35, 0x00, 0x24, 0x45, 0x79, 0xED, 0x17, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x05, 0x10, 0x03, 0xE0,
0x05, 0x31, 0x9C, 0x31, 0x04, 0x0E, 0x04, 0x11, 0x50, 0xE2, 0x05, 0x2F, 0x04, 0x02, 0x15, 0x00,
0x02, 0x00, 0x34, 0x00, 0x02, 0x80, 0x00, 0x12, 0x02, 0xFF, 0x05, 0x31, 0x0C, 0xC4, 0x21, 0x07,
0x00, 0xB0, 0xFF, 0xF2, 0x5F, 0x01, 0x00, 0x00, 0x01, 0x6B, 0xF7, 0xFF, 0xAB, 0x7C, 0x17, 0x40,
0x2A, 0xD0, 0xFF, 0xE6, 0x9D, 0x00, 0xF0, 0x07, 0x1C, 0xED, 0xFF, 0x08, 0x00, 0x00, 0x47, 0xE8,
0xFF, 0xD1, 0x04, 0x03, 0x8D, 0xFF, 0xFE, 0x89, 0x07, 0x00, 0x0C, 0xFF, 0xE1, 0x3F, 0x31, 0x00,
0x24, 0xA2, 0x0F, 0x72, 0x18, 0x03, 0xA0, 0x17, 0x04, 0xA0, 0x01, 0xF1, 0x17, 0x2D, 0xB9, 0xF2,
0xF4, 0xC2, 0x3F, 0x00, 0x09, 0xE7, 0xFF, 0xD3, 0xC5, 0xFF, 0xF9, 0x28, 0x36, 0xFF, 0xFE, 0x0E,
0x01, 0xC9, 0xFF, 0x87, 0x2A, 0xFF, 0xF7, 0x07, 0x00, 0xA7, 0xFF, 0xA6, 0x05, 0x33, 0x06, 0x00,
0x01, 0xD6, 0xFF, 0x39, 0x0F, 0x40, 0x3F, 0xFF, 0xFF, 0x3B, 0x4A, 0x06, 0x30, 0xD8, 0xFF, 0xAD,
0x35, 0x05, 0x41, 0xB6, 0xFF, 0xD5, 0x10, 0x66, 0x06, 0x21, 0xD8, 0x19, 0xCD, 0x13, 0x02, 0xEF,
0x00, 0x41, 0x00, 0x47, 0x88, 0x4F, 0x08, 0x00, 0x21, 0x16, 0x24, 0x17, 0x00, 0x47, 0x00, 0x98,
0xFF, 0xB0, 0x08, 0x00, 0x22, 0x10, 0x10, 0xD4, 0x07, 0x01, 0x85, 0x00, 0x82, 0x3C, 0x9D, 0xD4,
0xF6, 0xF6, 0xD2, 0x89, 0x15, 0x0E, 0x00, 0xB1, 0x0D, 0xA0, 0xFF, 0xFF, 0xD5, 0xAB, 0xB1, 0xE6,
0xFF, 0xED, 0x3B, 0xA2, 0x00, 0x40, 0xC4, 0xFF, 0xC4, 0x29, 0x2E, 0x01, 0x41, 0x6D, 0xFC, 0xEB,
0x18, 0xAA, 0x04, 0x13, 0xB7, 0x6E, 0x0C, 0x10, 0x76, 0x98, 0x02, 0xF2, 0x85, 0x15, 0xF6, 0xF6,
0x18, 0x00, 0x24, 0xB7, 0xF4, 0xA0, 0xFC, 0xAF, 0x05, 0xE3, 0xEC, 0x02, 0x00, 0x6D, 0xFF, 0x92,
0x00, 0x15, 0xE6, 0xFF, 0xCF, 0xD5, 0xFF, 0x8B, 0x00, 0x96, 0xFF, 0x23, 0x00, 0xAD, 0xFF, 0x3F,
0x00, 0x93, 0xFF, 0xA9, 0x02, 0x92, 0xFF, 0x65, 0x00, 0x70, 0xFF, 0x37, 0x00, 0xDA, 0xFF, 0x0D,
0x07, 0xF2, 0xFF, 0x1E, 0x00, 0xB6, 0xFF, 0x3F, 0x00, 0x6C, 0xFF, 0x34, 0x01, 0xFA, 0xEA, 0x00,
0x35, 0xFF, 0xDD, 0x00, 0x00, 0xDA, 0xFF, 0x19, 0x00, 0x8D, 0xFF, 0x1A, 0x06, 0xFF, 0xDF, 0x00,
0x4B, 0xFF, 0xCD, 0x00, 0x05, 0xFA, 0xF3, 0x01, 0x02, 0xD6, 0xDE, 0x01, 0x01, 0xFA, 0xEB, 0x00,
0x38, 0xFF, 0xF7, 0x33, 0x7C, 0xFF, 0xD9, 0x00, 0x6C, 0xFF, 0x79, 0x00, 0x00, 0xDE, 0xFF, 0x14,
0x06, 0xE2, 0xFF, 0xFF, 0xF5, 0xF6, 0xFA, 0xC3, 0xFF, 0xD5, 0x0A, 0x00, 0x00, 0x9D, 0xFF, 0x64,
0x00, 0x30, 0xBF, 0xD7, 0x57, 0x6C, 0xF2, 0xF4, 0xA6, 0x16, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xE1,
0x11, 0xE9, 0x01, 0x03, 0x65, 0x01, 0x41, 0x9F, 0xFF, 0xD4, 0x37, 0x10, 0x00, 0x13, 0x0C, 0x65,
0x06, 0x94, 0x9B, 0xFF, 0xFF, 0xDA, 0xAE, 0xA4, 0xBC, 0xE8, 0x9A, 0xFF, 0x00, 0xA8, 0x3B, 0xA0,
0xD8, 0xFA, 0xFC, 0xE0, 0xBA, 0x68, 0x00, 0x00, 0xF0, 0x0B, 0x41, 0x06, 0xF5, 0xFC, 0xD2, 0x09,
0x00, 0x53, 0x31, 0xFF, 0xFF, 0xFD, 0x0B, 0xBE, 0x09, 0x01, 0xD4, 0x03, 0x41, 0x00, 0x97, 0xFF,
0xEE, 0xB1, 0x0B, 0x41, 0x00, 0xCA, 0xFF, 0xA0, 0x6B, 0x0A, 0x61, 0x06, 0xF9, 0xFF, 0x4D, 0xFF,
0xD3, 0x2C, 0x00, 0x50, 0xEC, 0x0E, 0xFF, 0xFD, 0x0A, 0x2C, 0x00, 0x50, 0xC3, 0x00, 0xE4, 0xFF,
0x39, 0x2C, 0x00, 0x50, 0x99, 0x00, 0xBA, 0xFF, 0x6C, 0x2C, 0x00, 0x00, 0xB8, 0x04, 0x10, 0x9F,
0x2C, 0x00, 0x50, 0xB9, 0xA4, 0xC4, 0xFF, 0xD2, 0x58, 0x00, 0xF1, 0x09, 0x1B, 0x00, 0x3C, 0xFF,
0xFC, 0x09, 0x64, 0xFF, 0xF0, 0x01, 0x00, 0x11, 0xFF, 0xFF, 0x38, 0x97, 0xFF, 0xC5, 0x00, 0x00,
0x00, 0xE6, 0xFF, 0x6B, 0x30, 0x04, 0x01, 0xC0, 0x00, 0xF0, 0x09, 0xF5, 0xFC, 0xFC, 0xFA, 0xE5,
0xA4, 0x21, 0x00, 0xF8, 0xFF, 0xD5, 0xAB, 0xE4, 0xFF, 0xE0, 0x0A, 0xF8, 0xFF, 0x88, 0x00, 0x0D,
0xED, 0xFF, 0x4D, 0x08, 0x00, 0x41, 0x00, 0xC5, 0xFF, 0x6D, 0x08, 0x00, 0xC0, 0xD8, 0xFF, 0x5B,
0xF8, 0xFF, 0x88, 0x03, 0x52, 0xFF, 0xF3, 0x18, 0xF8, 0xB7, 0x02, 0x20, 0xE9, 0x3C, 0x30, 0x00,
0x50, 0xA9, 0xE5, 0xFF, 0xCF, 0x17, 0x20, 0x00, 0x41, 0x0A, 0xE2, 0xFF, 0x8E, 0x28, 0x00, 0x31,
0x9F, 0xFF, 0xCB, 0x08, 0x00, 0x30, 0x99, 0xFF, 0xD2, 0x08, 0x00, 0xC0, 0x03, 0xD5, 0xFF, 0xA9,
0xF8, 0xFF, 0xD2, 0x9F, 0xD6, 0xFF, 0xFE, 0x3E, 0x38, 0x00, 0x36, 0xF7, 0xC8, 0x4B, 0x00, 0x01,
0x70, 0x04, 0x7A, 0xD8, 0xF8, 0xED, 0xB2, 0x25, 0x50, 0x02, 0xF1, 0x13, 0xFA, 0xAE, 0xDA, 0xFF,
0xE0, 0x07, 0x03, 0xEE, 0xFF, 0x86, 0x00, 0x16, 0xFF, 0xFF, 0x48, 0x20, 0xFF, 0xFF, 0x5D, 0x00,
0x00, 0xFB, 0xFF, 0x6B, 0x2F, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0xF8, 0xFF, 0x70, 0x30, 0x09, 0x00,
0x32, 0x10, 0x10, 0x07, 0x09, 0x00, 0x00, 0x96, 0x0C, 0x0A, 0x09, 0x00, 0x35, 0x33, 0x34, 0x17,
0x2D, 0x00, 0xFA, 0x15, 0x21, 0xFF, 0xFF, 0x5E, 0x00, 0x01, 0xFC, 0xFF, 0x69, 0x03, 0xEF, 0xFF,
0x89, 0x00, 0x1B, 0xFF, 0xFF, 0x43, 0x00, 0x83, 0xFF, 0xFA, 0xAB, 0xD5, 0xFF, 0xDB, 0x04, 0x00,
0x03, 0x7B, 0xDF, 0xFC, 0xF2, 0xB5, 0x25, 0x00, 0x00, 0x01, 0x31, 0xE4, 0xA7, 0x23, 0xD0, 0x00,
0x40, 0xE8, 0xFF, 0xE6, 0x0D, 0xB8, 0x00, 0x40, 0x25, 0xFF, 0xFF, 0x63, 0x08, 0x00, 0x41, 0x01,
0xF8, 0xFF, 0x8C, 0xD0, 0x00, 0x31, 0xF5, 0xFF, 0x98, 0x08, 0x00, 0x1F, 0xF4, 0x08, 0x00, 0x0C,
0x03, 0x28, 0x00, 0x40, 0x01, 0xFC, 0xFF, 0x88, 0x08, 0x00, 0x20, 0x2C, 0xFF, 0x38, 0x01, 0x60,
0xD2, 0xA2, 0xE6, 0xFF, 0xE0, 0x09, 0x00, 0x01, 0x65, 0xE9, 0xAC, 0x21, 0x00, 0x07, 0x06, 0x78,
0x00, 0x91, 0xFC, 0xFC, 0xC9, 0xF8, 0xFF, 0xD5, 0xA4, 0xA4, 0x83, 0x3C, 0x00, 0x1F, 0x00, 0x06,
0x00, 0x01, 0x41, 0xFF, 0xFC, 0xFC, 0x1C, 0x24, 0x00, 0x1F, 0x12, 0x24, 0x00, 0x07, 0x41, 0xD2,
0x9C, 0x9C, 0x82, 0x96, 0x01, 0x19, 0xD4, 0x5C, 0x00, 0x11, 0xAE, 0x38, 0x00, 0x1F, 0x71, 0x5C,
0x00, 0x0A, 0x11, 0x0C, 0x24, 0x00, 0x1E, 0x08, 0x24, 0x00, 0x0E, 0x06, 0x00, 0x05, 0xB8, 0x01,
0x70, 0x03, 0x77, 0xD8, 0xF9, 0xEE, 0xB3, 0x2C, 0xA8, 0x03, 0xF0, 0x02, 0xFA, 0xB1, 0xD6, 0xFF,
0xEB, 0x0F, 0x02, 0xEC, 0xFF, 0x87, 0x00, 0x0C, 0xF9, 0xFF, 0x5E, 0x1D, 0xFF, 0xD6, 0x06, 0x41,
0xE0, 0xFF, 0x85, 0x2D, 0x8B, 0x01, 0x3F, 0x94, 0xAC, 0x5F, 0xAF, 0x01, 0x03, 0x50, 0x20, 0xFC,
0xFC, 0xFC, 0x9A, 0x09, 0x00, 0x52, 0x15, 0xA4, 0xDF, 0xFF, 0x9C, 0x2D, 0x00, 0xF3, 0x1B, 0xA5,
0xFF, 0x9C, 0x19, 0xFF, 0xFF, 0x61, 0x00, 0x00, 0xAF, 0xFF, 0x9C, 0x01, 0xE6, 0xFF, 0x90, 0x00,
0x05, 0xE2, 0xFF, 0x9C, 0x00, 0x80, 0xFF, 0xFC, 0xAF, 0xCB, 0xF6, 0xFF, 0x9C, 0x00, 0x05, 0x82,
0xE4, 0xFD, 0xD0, 0x49, 0xFF, 0x9C, 0x00, 0x00, 0x0A, 0xB8, 0x01, 0xFF, 0x01, 0xF1, 0xFC, 0x8E,
0x00, 0x00, 0xA2, 0xFC, 0xD9, 0xF4, 0xFF, 0x90, 0x00, 0x00, 0xA4, 0xFF, 0xDC, 0x08, 0x00, 0x0F,
0x40, 0xFF, 0xFC, 0xFC, 0xFF, 0x08, 0x00, 0x4E, 0xD8, 0xA4, 0xA4, 0xDF, 0x30, 0x00, 0x0F, 0x08,
0x00, 0x0D, 0x22, 0x05, 0x03, 0x78, 0x00, 0x6F, 0xE1, 0xFC, 0x92, 0xE4, 0xFF, 0x94, 0x03, 0x00,
0x11, 0x44, 0x00, 0x00, 0x06, 0x05, 0xEC, 0x03, 0x85, 0xFC, 0xFC, 0x7E, 0x00, 0x00, 0xFF, 0xFF,
0x7F, 0x05, 0x00, 0x1A, 0x7E, 0x05, 0x00, 0x15, 0x7D, 0x05, 0x00, 0x12, 0x7C, 0x05, 0x00, 0x40,
0x02, 0xFF, 0xFF, 0x7B, 0xFE, 0x07, 0xA9, 0x6C, 0xA9, 0xF4, 0xFF, 0xFF, 0x30, 0xD8, 0xFD, 0xE3,
0x70, 0xB4, 0x02, 0x51, 0x86, 0x00, 0x0B, 0xEB, 0xFC, 0x9C, 0x03, 0xB0, 0x6A, 0xFF, 0xF4, 0x10,
0xF8, 0xFF, 0x88, 0x02, 0xDB, 0xFF, 0x98, 0xAA, 0x01, 0x40, 0x4F, 0xFF, 0xFF, 0x2D, 0x08, 0x00,
0x30, 0xC1, 0xFF, 0xC0, 0xBA, 0x01, 0x11, 0xBC, 0xA8, 0x0A, 0x01, 0x1E, 0x02, 0x10, 0x1E, 0x08,
0x00, 0x20, 0xEF, 0xEF, 0x5E, 0x0A, 0x70, 0xF8, 0xFF, 0x91, 0x98, 0xFF, 0xD6, 0x01, 0x28, 0x00,
0x40, 0x3B, 0xFF, 0xFF, 0x36, 0x08, 0x00, 0x41, 0x01, 0xDD, 0xFF, 0x96, 0xEA, 0x01, 0x43, 0x81,
0xFF, 0xEF, 0x08, 0x04, 0x03, 0x11, 0x57, 0xFA, 0x01, 0x36, 0xC7, 0xFF, 0xB8, 0x58, 0x02, 0x1E,
0x86, 0x28, 0x02, 0x0F, 0x06, 0x00, 0x22, 0x42, 0xDF, 0xB8, 0xB8, 0x99, 0xB4, 0x02, 0x22, 0x0C,
0x0A, 0x5C, 0x00, 0xF0, 0x09, 0xC4, 0xFC, 0xE2, 0x00, 0x00, 0x00, 0x42, 0xFC, 0xFC, 0x5D, 0xCB,
0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x78, 0xFF, 0xFF, 0x62, 0xCF, 0xFF, 0xFF, 0x4D, 0x2D, 0x10, 0xF5,
0x61, 0xFF, 0x66, 0xD4, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0xE2, 0xFF, 0xFF, 0x6B, 0xD8, 0xFF, 0xF4,
0xB5, 0x00, 0x18, 0xFF, 0xF6, 0xFF, 0x6F, 0xDC, 0xFF, 0xBF, 0xE9, 0x01, 0x4D, 0xFF, 0xC0, 0xFF,
0x73, 0xE0, 0xFF, 0x85, 0xFF, 0x1D, 0x82, 0xFF, 0x88, 0xFF, 0x77, 0xE5, 0xFF, 0x4C, 0xFF, 0x51,
0xB7, 0xE4, 0x6B, 0xFF, 0x7C, 0xE9, 0xFF, 0x14, 0xFF, 0x86, 0xED, 0xAF, 0x66, 0xFF, 0x80, 0xED,
0xFE, 0x00, 0xDC, 0xDA, 0xFF, 0x7A, 0x61, 0xFF, 0x84, 0xF2, 0xFA, 0x00, 0xA7, 0xFF, 0xFF, 0x45,
0x5D, 0xFF, 0x89, 0xF6, 0xF6, 0x00, 0x72, 0xFF, 0xFF, 0x11, 0x58, 0xFF, 0x8D, 0xFA, 0xF2, 0x00,
0x3D, 0xFF, 0xDB, 0x00, 0x54, 0xFF, 0x91, 0xFE, 0xEE, 0x00, 0x0B, 0xFD, 0xA6, 0x00, 0x4F, 0xFF,
0x96, 0x68, 0x01, 0xA0, 0xEA, 0x09, 0x00, 0x00, 0xDD, 0xFC, 0x34, 0xF8, 0xFF, 0x62, 0xD8, 0x02,
0x52, 0x34, 0xF8, 0xFF, 0xCF, 0x01, 0x08, 0x00, 0x23, 0xFF, 0x3B, 0x08, 0x00, 0x12, 0xA8, 0x08,
0x00, 0x31, 0xFC, 0xFB, 0x1A, 0x08, 0x00, 0x31, 0xAD, 0xFF, 0x82, 0x08, 0x00, 0x40, 0x47, 0xFE,
0xE9, 0xE7, 0x08, 0x00, 0x41, 0x28, 0xB3, 0xFF, 0xFF, 0x08, 0x00, 0x13, 0x4A, 0x08, 0x00, 0x22,
0x03, 0xDF, 0x08, 0x00, 0x23, 0x00, 0x78, 0x08, 0x00, 0x22, 0x16, 0xFA, 0x08, 0x00, 0x55, 0x00,
0xA5, 0xFF, 0x34, 0x0A, 0x1C, 0x05, 0x60, 0x79, 0xD7, 0xF9, 0xEE, 0xB5, 0x2E, 0x1C, 0x05, 0xF0,
0x04, 0xFB, 0xB1, 0xD5, 0xFF, 0xF0, 0x18, 0x03, 0xF0, 0xFF, 0x87, 0x00, 0x0B, 0xF2, 0xFF, 0x79,
0x21, 0xFF, 0xFF, 0x5F, 0x10, 0x12, 0x21, 0xAB, 0x2F, 0x6D, 0x03, 0x4F, 0xD0, 0xFF, 0xBC, 0x30,
0x09, 0x00, 0x18, 0x20, 0xBB, 0x1F, 0x1C, 0x05, 0xFA, 0x0F, 0x00, 0xD3, 0xFF, 0xAA, 0x02, 0xEC,
0xFF, 0x85, 0x00, 0x09, 0xF2, 0xFF, 0x79, 0x00, 0x82, 0xFF, 0xF9, 0xA9, 0xCE, 0xFF, 0xF0, 0x18,
0x00, 0x04, 0x7A, 0xDA, 0xFC, 0xF2, 0xBE, 0x31, 0x1C, 0x05, 0x40, 0xFC, 0xF3, 0xBA, 0x2C, 0x1C,
0x05, 0x50, 0xA8, 0xDD, 0xFF, 0xE8, 0x0E, 0xBE, 0x01, 0x41, 0x10, 0xF8, 0xFF, 0x59, 0xC6, 0x01,
0x31, 0xDC, 0xFF, 0x7E, 0x08, 0x00, 0x30, 0xE5, 0xFF, 0x7A, 0x80, 0x02, 0x41, 0x4C, 0xFF, 0xFF,
0x48, 0xD2, 0x01, 0x30, 0xFF, 0xBA, 0x02, 0x56, 0x04, 0x33, 0x96, 0x57, 0x04, 0xEE, 0x01, 0x1F,
0x00, 0x08, 0x00, 0x16, 0x23, 0x0A, 0x09, 0x34, 0x08, 0x0C, 0x00, 0x01, 0x14, 0x17, 0x00, 0x01,
0x1F, 0x78, 0x00, 0x01, 0x3D, 0x13, 0x78, 0x00, 0x01, 0x11, 0xF1, 0x00, 0x01, 0x42, 0xFD, 0xFF,
0xFA, 0x3A, 0x82, 0x01, 0x32, 0x90, 0xFF, 0xAA, 0x32, 0x10, 0x43, 0x04, 0xAC, 0xF7, 0x09, 0xF9,
0x04, 0x2A, 0x4D, 0x00, 0x1C, 0x01, 0x40, 0xF9, 0xE3, 0xA6, 0x27, 0x1C, 0x01, 0x50, 0xAA, 0xE8,
0xFF, 0xEB, 0x15, 0xC4, 0x00, 0x41, 0x16, 0xFB, 0xFF, 0x69, 0xCC, 0x00, 0x12, 0xD6, 0x38, 0x06,
0xC2, 0x01, 0xE5, 0xFF, 0x82, 0xF8, 0xFF, 0x88, 0x07, 0x64, 0xFF, 0xFF, 0x50, 0x1C, 0x01, 0x90,
0xB6, 0x04, 0xF8, 0xFF, 0xD5, 0xC0, 0xFF, 0xFA, 0x0A, 0xF4, 0x00, 0x41, 0x20, 0xFF, 0xFF, 0x45,
0xFC, 0x00, 0x31, 0xDE, 0xFF, 0x8D, 0x08, 0x00, 0x31, 0x9C, 0xFF, 0xD5, 0x08, 0x00, 0x40, 0x5A,
0xFF, 0xFF, 0x1D, 0x08, 0x00, 0x43, 0x19, 0xFF, 0xFF, 0x64, 0x50, 0x00, 0x15, 0xAC, 0xC8, 0x09,
0xF0, 0x01, 0x16, 0xA1, 0xEB, 0xF7, 0xCC, 0x49, 0x00, 0x01, 0xC8, 0xFF, 0xDA, 0xB4, 0xFF, 0xFA,
0x27, 0x2F, 0xDA, 0x03, 0x40, 0xAE, 0xFF, 0x87, 0x4A, 0x68, 0x0B, 0x70, 0x76, 0xD2, 0x72, 0x2D,
0xFF, 0xFF, 0xB1, 0x22, 0x0A, 0x50, 0x02, 0xD0, 0xFF, 0xFF, 0xB6, 0x92, 0x08, 0x50, 0x26, 0xE8,
0xFF, 0xFF, 0xCA, 0x78, 0x16, 0x50, 0x23, 0xDB, 0xFF, 0xFF, 0xC9, 0x5A, 0x09, 0xF3, 0x1F, 0x16,
0xCC, 0xFF, 0xFF, 0x74, 0x02, 0x2A, 0x52, 0x00, 0x11, 0xE5, 0xFF, 0xD0, 0x44, 0xFF, 0xF5, 0x03,
0x00, 0x89, 0xFF, 0xED, 0x15, 0xFD, 0xFF, 0x43, 0x00, 0x88, 0xFF, 0xD1, 0x00, 0xA1, 0xFF, 0xEF,
0xA8, 0xF5, 0xFF, 0x67, 0x00, 0x09, 0x8B, 0xE4, 0xFE, 0xDC, 0x6D, 0x01, 0x07, 0x78, 0x00, 0x11,
0xED, 0xC4, 0x0C, 0xD3, 0xFC, 0x1C, 0x9A, 0xA4, 0xDE, 0xFF, 0xF5, 0xA4, 0xA4, 0x12, 0x00, 0x00,
0xA0, 0xEE, 0x0D, 0x0F, 0x08, 0x00, 0x43, 0x04, 0x0C, 0x03, 0xA1, 0x14, 0xFC, 0xFC, 0x5B, 0x00,
0x00, 0xC5, 0xFC, 0xA6, 0x14, 0xC4, 0x01, 0x3F, 0xC8, 0xFF, 0xA8, 0x09, 0x00, 0x2C, 0x11, 0x13,
0x09, 0x00, 0xF7, 0x17, 0xC9, 0xFF, 0xA6, 0x06, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0xCF, 0xFF, 0x96,
0x00, 0xD6, 0xFF, 0x95, 0x00, 0x0D, 0xF5, 0xFF, 0x68, 0x00, 0x6D, 0xFF, 0xFE, 0xAE, 0xD3, 0xFF,
0xED, 0x14, 0x00, 0x02, 0x74, 0xDB, 0xFB, 0xF3, 0xBC, 0x32, 0xF8, 0x06, 0xF0, 0x1B, 0x81, 0xFC,
0xB1, 0x00, 0x00, 0x01, 0xEE, 0xFC, 0x4E, 0x51, 0xFF, 0xE2, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0x1C,
0x1E, 0xFF, 0xFF, 0x13, 0x00, 0x4D, 0xFF, 0xE9, 0x01, 0x01, 0xEC, 0xFF, 0x42, 0x00, 0x7A, 0xFF,
0xB6, 0x00, 0x00, 0xB9, 0xFF, 0x71, 0x00, 0xA7, 0xC0, 0x0D, 0xF0, 0x01, 0x86, 0xFF, 0xA1, 0x00,
0xD4, 0xFF, 0x4F, 0x00, 0x00, 0x53, 0xFF, 0xD0, 0x07, 0xFC, 0xFF, 0x1C, 0x32, 0x00, 0x40, 0xFA,
0x35, 0xFF, 0xE9, 0xCC, 0x0B, 0x41, 0xED, 0xFF, 0x8B, 0xFF, 0xBE, 0x11, 0x31, 0xBA, 0xFF, 0xE5,
0xEC, 0x0D, 0x51, 0x00, 0x87, 0xFF, 0xFF, 0xFF, 0x4C, 0x0B, 0x30, 0x54, 0xFF, 0xFF, 0x2C, 0x00,
0x41, 0x00, 0x00, 0x21, 0xFF, 0x2C, 0x00, 0x00, 0x72, 0x00, 0x02, 0x2C, 0x00, 0x32, 0x00, 0x0C,
0x0C, 0x88, 0x00, 0xF0, 0x0E, 0x5E, 0xFC, 0xB9, 0x00, 0x00, 0xCE, 0xFB, 0x0B, 0x00, 0x7B, 0xFC,
0x90, 0x3B, 0xFF, 0xDB, 0x00, 0x03, 0xF8, 0xFF, 0x33, 0x00, 0x9C, 0xFF, 0x6E, 0x17, 0xFF, 0xFA,
0x02, 0x24, 0x39, 0x09, 0xF0, 0x15, 0xBC, 0xFF, 0x4A, 0x01, 0xF3, 0xFF, 0x1B, 0x4E, 0xFF, 0xFF,
0x88, 0x00, 0xDC, 0xFF, 0x26, 0x00, 0xCF, 0xFF, 0x3B, 0x77, 0xFF, 0xFC, 0xB2, 0x02, 0xFA, 0xFD,
0x06, 0x00, 0xAB, 0xFF, 0x5A, 0xA1, 0xFA, 0xC2, 0xDD, 0x1B, 0x4F, 0x0E, 0xF0, 0x07, 0x87, 0xFF,
0x7A, 0xCB, 0xD3, 0x94, 0xFE, 0x45, 0xFF, 0xBA, 0x00, 0x00, 0x63, 0xFF, 0x9B, 0xF4, 0xA8, 0x69,
0xFF, 0x8C, 0xFF, 0x96, 0xFD, 0x0B, 0x90, 0xD8, 0xFF, 0x7E, 0x3F, 0xFF, 0xD7, 0xFF, 0x72, 0x00,
0x3D, 0x09, 0x50, 0xFF, 0x53, 0x14, 0xFF, 0xFF, 0x35, 0x16, 0x20, 0x02, 0xF6, 0xC2, 0x11, 0x41,
0xEA, 0xFF, 0xFF, 0x2A, 0x91, 0x16, 0x60, 0xFA, 0x05, 0x00, 0xBF, 0xFF, 0xFE, 0x24, 0x03, 0x60,
0xAF, 0xFF, 0xD4, 0x00, 0x00, 0x95, 0x16, 0x01, 0x50, 0x00, 0x00, 0x8B, 0xFF, 0xA9, 0x6D, 0x0F,
0x43, 0xBE, 0x00, 0x00, 0x08, 0x38, 0x01, 0xF0, 0x00, 0x8B, 0xFC, 0xC9, 0x00, 0x00, 0x40, 0xFC,
0xE7, 0x06, 0x27, 0xFF, 0xFF, 0x35, 0x00, 0x9B, 0x4E, 0x07, 0x70, 0xBD, 0xFF, 0x9F, 0x07, 0xEF,
0xFF, 0x30, 0xEF, 0x00, 0x40, 0xF7, 0x61, 0xFF, 0xCF, 0x70, 0x0D, 0x32, 0xE7, 0xFF, 0xF4, 0xCB,
0x12, 0x41, 0x83, 0xFF, 0xFF, 0xFA, 0x25, 0x19, 0x21, 0x2B, 0xFF, 0x7D, 0x0C, 0x41, 0x00, 0x00,
0x67, 0xFF, 0x0C, 0x17, 0x00, 0x89, 0x06, 0x20, 0xFF, 0xFA, 0x2F, 0x10, 0x40, 0x27, 0xFF, 0xF3,
0xE1, 0xA9, 0x0B, 0xF0, 0x0F, 0x00, 0x86, 0xFF, 0x9F, 0x78, 0xFF, 0xDF, 0x03, 0x00, 0x03, 0xE4,
0xFF, 0x43, 0x16, 0xF9, 0xFF, 0x4A, 0x00, 0x45, 0xFF, 0xE4, 0x03, 0x00, 0xA4, 0xFF, 0xB3, 0x00,
0xA5, 0xFF, 0x8A, 0xA9, 0x0B, 0x26, 0xFE, 0x1F, 0x88, 0x00, 0xF0, 0x09, 0xAD, 0xFC, 0xA4, 0x00,
0x00, 0x50, 0xFC, 0xF0, 0x08, 0x5E, 0xFF, 0xEF, 0x05, 0x00, 0x9B, 0xFF, 0xAA, 0x00, 0x11, 0xFB,
0xFF, 0x41, 0x01, 0xE5, 0x7D, 0x08, 0x70, 0xB8, 0xFF, 0x8F, 0x30, 0xFF, 0xF9, 0x0E, 0x90, 0x15,
0x30, 0xDE, 0x7B, 0xFF, 0x1A, 0x2D, 0x61, 0x16, 0xFD, 0xFF, 0xE4, 0xFF, 0x62, 0x55, 0x13, 0x31,
0xFF, 0xFF, 0xFD, 0x91, 0x00, 0x42, 0x6D, 0xFF, 0xFF, 0xBE, 0x53, 0x11, 0x32, 0xFF, 0xFF, 0x71,
0x5B, 0x0D, 0x01, 0x4A, 0x02, 0x0F, 0x09, 0x00, 0x14, 0x04, 0xC4, 0x13, 0x11, 0x38, 0x47, 0x03,
0xD1, 0xCD, 0x24, 0xA4, 0xA4, 0xA4, 0xEF, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x11, 0xFA, 0x22, 0x00,
0x30, 0x61, 0xFF, 0xF7, 0x21, 0x00, 0x11, 0xB7, 0xF6, 0x00, 0x40, 0x13, 0xFB, 0xFF, 0x56, 0x0A,
0x16, 0x31, 0xFF, 0xF4, 0x0B, 0x28, 0x02, 0x00, 0xF7, 0x0F, 0x21, 0x15, 0xFC, 0xD2, 0x13, 0x30,
0x66, 0xFF, 0xF1, 0x75, 0x01, 0x32, 0xBC, 0xFF, 0xA1, 0xA7, 0x00, 0x11, 0x4A, 0x13, 0x11, 0x61,
0xFF, 0xA2, 0x9C, 0x9C, 0x82, 0x68, 0x63, 0x04, 0x10, 0xD4, 0x60, 0x14, 0x02, 0x48, 0x05, 0x10,
0x05, 0x6B, 0x00, 0x90, 0x14, 0x05, 0xFF, 0xFF, 0xA7, 0xA4, 0x0D, 0x05, 0xFF, 0x32, 0x0E, 0x02,
0x06, 0x00, 0x1F, 0x06, 0x06, 0x00, 0x04, 0x1F, 0x07, 0x06, 0x00, 0x04, 0x1F, 0x08, 0x06, 0x00,
0x01, 0x41, 0xA3, 0xA0, 0x0A, 0x08, 0xBA, 0x14, 0x06, 0xDC, 0x00, 0x31, 0x40, 0xFC, 0x5A, 0xEB,
0x00, 0x21, 0xF5, 0xA2, 0x0F, 0x00, 0x32, 0xB4, 0xE8, 0x02, 0x39, 0x01, 0x00, 0x54, 0x06, 0x41,
0x00, 0x26, 0xFF, 0x78, 0xD1, 0x02, 0x21, 0xDE, 0xC0, 0x1D, 0x00, 0x21, 0x97, 0xFB, 0x8E, 0x0F,
0x12, 0x50, 0xF9, 0x02, 0x31, 0x0E, 0xFB, 0x96, 0x16, 0x00, 0x21, 0xC1, 0xDE, 0xF6, 0x02, 0x20,
0x7A, 0xFF, 0xA3, 0x0B, 0x22, 0x00, 0x33, 0x05, 0x0D, 0x22, 0x02, 0xEA, 0xAD, 0x2E, 0x20, 0xA4,
0xF5, 0xC2, 0x00, 0x03, 0x2C, 0x16, 0x80, 0x9E, 0xFC, 0xFC, 0xFC, 0x77, 0x67, 0xA4, 0xDB, 0x56,
0x00, 0x1F, 0x98, 0x05, 0x00, 0x2B, 0x81, 0x64, 0xA0, 0xD9, 0xFF, 0x78, 0xA0, 0xFF, 0xFF, 0xA1,
0x00, 0x24, 0x08, 0x08, 0x2C, 0x16, 0x31, 0x4D, 0xFC, 0xFC, 0x28, 0x15, 0x21, 0xBB, 0xFF, 0x83,
0x0D, 0x60, 0x29, 0xFF, 0xB9, 0xD2, 0xF9, 0x16, 0xEA, 0x02, 0xF1, 0x09, 0x5D, 0x76, 0xFF, 0x7D,
0x00, 0x0F, 0xF4, 0xF5, 0x0C, 0x1D, 0xFE, 0xE7, 0x06, 0x2C, 0x84, 0x61, 0x00, 0x00, 0x6E, 0x84,
0x21, 0x06, 0x07, 0x02, 0x98, 0x00, 0x11, 0xA0, 0x01, 0x00, 0x33, 0x0A, 0xFF, 0xFF, 0x1C, 0x01,
0x31, 0x05, 0x05, 0x04, 0xF0, 0x27, 0xF0, 0x00, 0x04, 0xC8, 0xFC, 0x61, 0x00, 0x00, 0x2A, 0xF8,
0xB7, 0x00, 0x00, 0x00, 0x73, 0xFB, 0x12, 0x26, 0x16, 0x42, 0x01, 0x08, 0x08, 0x0A, 0xD4, 0x05,
0xE0, 0x24, 0xAF, 0xF1, 0xF1, 0xA7, 0x10, 0x00, 0x01, 0xCF, 0xFF, 0xC9, 0xE5, 0xFF, 0x8D, 0xFE,
0x03, 0xA1, 0x17, 0x70, 0xFF, 0xD3, 0x00, 0x14, 0x5C, 0x5C, 0x03, 0x70, 0x0E, 0x05, 0x21, 0x40,
0xBF, 0xB6, 0x13, 0xF4, 0x18, 0x7C, 0xFF, 0xD2, 0x87, 0xFF, 0xE0, 0x00, 0x22, 0xFF, 0xFD, 0x1E,
0x64, 0xFF, 0xE0, 0x00, 0x4F, 0xFF, 0xEF, 0x02, 0x6B, 0xFF, 0xE1, 0x00, 0x2A, 0xFF, 0xFF, 0xB7,
0xE4, 0xFF, 0xEB, 0x00, 0x00, 0x7D, 0xF3, 0xDB, 0x51, 0xFF, 0xFE, 0x05, 0x2C, 0x06, 0x41, 0x18,
0xFC, 0xFC, 0x3C, 0x08, 0x00, 0x2F, 0xFF, 0xFF, 0x08, 0x00, 0x05, 0x40, 0x88, 0xD4, 0xF0, 0x70,
0x08, 0x00, 0xD1, 0xDB, 0xC4, 0xFF, 0xFD, 0x1A, 0x18, 0xFF, 0xFF, 0x3D, 0x09, 0xFB, 0xFF, 0x56,
0x20, 0x00, 0x31, 0xED, 0xFF, 0x64, 0x08, 0x00, 0x1B, 0xEC, 0x08, 0x00, 0x30, 0xED, 0xFF, 0x63,
0x08, 0x00, 0xF3, 0x07, 0x07, 0xFB, 0xFF, 0x50, 0x18, 0xFF, 0xFF, 0xCF, 0xBB, 0xFF, 0xFA, 0x15,
0x18, 0xFF, 0xFF, 0x95, 0xE0, 0xF1, 0x68, 0x00, 0x07, 0x07, 0xD0, 0x00, 0xF1, 0x0D, 0x30, 0xC3,
0xF6, 0xED, 0xA4, 0x10, 0x03, 0xE0, 0xFF, 0xC8, 0xE3, 0xFF, 0x8C, 0x2F, 0xFF, 0xFF, 0x19, 0x64,
0xFF, 0xCB, 0x4A, 0xFF, 0xFF, 0x09, 0x44, 0xC4, 0xA3, 0x4C, 0x40, 0x02, 0x13, 0x00, 0x07, 0x00,
0x00, 0x15, 0x00, 0xF7, 0x09, 0x54, 0xF4, 0xCB, 0x30, 0xFF, 0xFF, 0x18, 0x65, 0xFF, 0xC9, 0x04,
0xE2, 0xFF, 0xC8, 0xE2, 0xFF, 0x89, 0x00, 0x34, 0xC8, 0xFA, 0xF0, 0xA3, 0x0E, 0xBC, 0x10, 0x61,
0x00, 0x00, 0x00, 0x2C, 0xFC, 0xFC, 0x14, 0x1F, 0x3E, 0x2C, 0xFF, 0xFF, 0x08, 0x00, 0xF0, 0x04,
0x4C, 0xE3, 0xE9, 0x9A, 0xFF, 0xFF, 0x28, 0x04, 0xE9, 0xFF, 0xD2, 0xCE, 0xFF, 0xFF, 0x28, 0x2F,
0xFF, 0xFF, 0x27, 0x18, 0x00, 0x40, 0x46, 0xFF, 0xFF, 0x11, 0x08, 0x00, 0x48, 0x48, 0xFF, 0xFF,
0x10, 0x08, 0x00, 0x13, 0x47, 0x18, 0x00, 0x40, 0x34, 0xFF, 0xFF, 0x22, 0x08, 0x00, 0x50, 0x06,
0xF4, 0xFF, 0xCC, 0xC5, 0x48, 0x00, 0x84, 0x5B, 0xE6, 0xED, 0x9C, 0xFF, 0xFF, 0x28, 0x08, 0xC8,
0x00, 0xF1, 0x03, 0x2D, 0xC1, 0xF6, 0xEE, 0x9F, 0x0B, 0x03, 0xDD, 0xFF, 0xC3, 0xDE, 0xFF, 0x83,
0x2E, 0xFF, 0xFF, 0x0F, 0x58, 0xC8, 0x00, 0x51, 0x9E, 0xBC, 0xFF, 0xE1, 0x4C, 0xE1, 0x01, 0x10,
0xE4, 0xC8, 0x00, 0xF4, 0x14, 0x04, 0x04, 0x04, 0x4A, 0xFF, 0xFF, 0x04, 0x2B, 0x88, 0x79, 0x30,
0xFF, 0xFF, 0x14, 0x60, 0xFF, 0xD5, 0x04, 0xE3, 0xFF, 0xCD, 0xE6, 0xFF, 0x8D, 0x00, 0x35, 0xC7,
0xF9, 0xEF, 0xA0, 0x0D, 0x00, 0x00, 0x05, 0x06, 0x9C, 0x13, 0xC1, 0xAE, 0xF5, 0xF0, 0x0F, 0x00,
0x6D, 0xFF, 0xFC, 0xB3, 0x0D, 0x00, 0x98, 0x4F, 0x04, 0x10, 0xA0, 0x2D, 0x11, 0xC2, 0xAE, 0xFF,
0xFF, 0xFF, 0xFC, 0x10, 0x71, 0xDE, 0xFF, 0xE4, 0xA4, 0x0B, 0x12, 0x00, 0x0F, 0x06, 0x00, 0x17,
0x00, 0xE0, 0x04, 0x16, 0xFD, 0xBA, 0x12, 0xF0, 0x0A, 0x0F, 0x00, 0x00, 0x2A, 0xBB, 0xF6, 0xE5,
0x64, 0x86, 0xD4, 0x01, 0x01, 0xD9, 0xFF, 0xC2, 0xE1, 0xFF, 0xDB, 0x68, 0x04, 0x28, 0xFF, 0xF7,
0x04, 0x57, 0x44, 0x04, 0x50, 0x42, 0xFF, 0xE6, 0x00, 0x44, 0x71, 0x05, 0x50, 0x2F, 0xFF, 0xF4,
0x04, 0x54, 0x58, 0x15, 0x50, 0x03, 0xD3, 0xFF, 0xBA, 0xDD, 0x79, 0x0C, 0xD1, 0x00, 0x7D, 0xF2,
0xF8, 0xF3, 0x9D, 0x08, 0x00, 0x00, 0x2C, 0xFE, 0x9B, 0x1B, 0x83, 0x12, 0xF0, 0x06, 0x2C, 0xFA,
0xFF, 0xFF, 0xFD, 0xDA, 0x73, 0x01, 0x00, 0x02, 0xA8, 0xE9, 0x9E, 0xB9, 0xF2, 0xFF, 0x43, 0x00,
0x66, 0xFF, 0x84, 0xE7, 0x14, 0xF7, 0x04, 0x6F, 0x00, 0x96, 0xFF, 0xEE, 0xAD, 0xA6, 0xE7, 0xFF,
0x44, 0x00, 0x20, 0xB0, 0xEC, 0xFF, 0xFD, 0xDA, 0x7C, 0x01, 0x68, 0x12, 0x52, 0x10, 0xFC, 0xFC,
0x3F, 0x00, 0x9F, 0x14, 0x1F, 0x40, 0x08, 0x00, 0x04, 0x70, 0x6F, 0xB8, 0xF6, 0xB3, 0x03, 0x10,
0xFF, 0xA0, 0x14, 0xA0, 0xFF, 0x3B, 0x10, 0xFF, 0xFF, 0x43, 0x09, 0xFF, 0xFF, 0x4C, 0x20, 0x00,
0x1F, 0x04, 0x08, 0x00, 0x20, 0x04, 0xA8, 0x1D, 0x85, 0x08, 0xFC, 0xFC, 0x4B, 0x06, 0xA4, 0xA4,
0x31, 0xF8, 0x12, 0x7F, 0xFC, 0xFC, 0x47, 0x08, 0xFF, 0xFF, 0x48, 0x04, 0x00, 0x0D, 0x42, 0x04,
0x05, 0x11, 0xFF, 0x40, 0x01, 0x97, 0xE1, 0xFC, 0x73, 0x00, 0x00, 0x93, 0xA4, 0x4B, 0x00, 0x01,
0x00, 0x30, 0xDD, 0xFC, 0x6F, 0xFA, 0x0B, 0x1F, 0x70, 0x05, 0x00, 0x16, 0xF6, 0x00, 0x04, 0xEE,
0xFF, 0x6D, 0x31, 0xD9, 0xFF, 0xFF, 0x37, 0x34, 0xF7, 0xEC, 0x7D, 0x01, 0x00, 0x80, 0x06, 0x53,
0x18, 0xFC, 0xFC, 0x38, 0x00, 0x75, 0x03, 0x0F, 0x09, 0x00, 0x0A, 0x40, 0x9F, 0xFC, 0xD9, 0x08,
0x09, 0x00, 0x10, 0x3F, 0xA2, 0x16, 0x71, 0x18, 0xFF, 0xFF, 0x3E, 0xD6, 0xFF, 0xB3, 0x1B, 0x00,
0x41, 0xB0, 0xFF, 0xF8, 0x22, 0x09, 0x00, 0x41, 0xFF, 0xFF, 0xEF, 0x09, 0x09, 0x00, 0x42, 0xB3,
0xE3, 0xFF, 0x5D, 0xCE, 0x03, 0x32, 0x89, 0xFF, 0xC3, 0x3F, 0x00, 0x10, 0x2E, 0xA0, 0x07, 0x01,
0x48, 0x00, 0x32, 0xD2, 0xFF, 0x8F, 0x09, 0x00, 0x40, 0x76, 0xFF, 0xEE, 0x08, 0x90, 0x1A, 0x04,
0xB8, 0x0A, 0x4F, 0x5B, 0xF8, 0xFF, 0x5C, 0x03, 0x00, 0x11, 0x00, 0x74, 0x08, 0x02, 0x08, 0x03,
0xF0, 0x09, 0x1C, 0xFC, 0xFC, 0x67, 0xD3, 0xF6, 0x90, 0x39, 0xC7, 0xF7, 0xA6, 0x03, 0x1C, 0xFF,
0xFF, 0xE9, 0xBB, 0xFF, 0xFF, 0xE9, 0xB4, 0xFF, 0xFF, 0x3C, 0x54, 0x16, 0xFF, 0x05, 0x03, 0xFC,
0xFF, 0x46, 0x00, 0xDE, 0xFF, 0x5B, 0x1C, 0xFF, 0xFF, 0x18, 0x00, 0xF8, 0xFF, 0x3C, 0x00, 0xD8,
0xFF, 0x5C, 0x0C, 0x00, 0x35, 0x25, 0x08, 0x08, 0x80, 0x00, 0xFF, 0x07, 0x6F, 0xB7, 0xF6, 0xA1,
0x01, 0x1C, 0xFF, 0xFF, 0xE3, 0xC4, 0xFF, 0xFF, 0x22, 0x1C, 0xFF, 0xFF, 0x3A, 0x21, 0xFF, 0xFF,
0x38, 0x1C, 0x04, 0x00, 0x24, 0x05, 0xE0, 0x03, 0x80, 0x2C, 0xBF, 0xF6, 0xED, 0x9D, 0x0D, 0x04,
0xDF, 0xA8, 0x04, 0xF5, 0x05, 0x96, 0x33, 0xFF, 0xFF, 0x13, 0x5D, 0xFF, 0xE7, 0x4B, 0xFF, 0xFF,
0x01, 0x4D, 0xFF, 0xFF, 0x4C, 0xFF, 0xFF, 0x00, 0x4C, 0x07, 0x00, 0xF0, 0x0D, 0x4B, 0xFF, 0xFF,
0x00, 0x4D, 0xFF, 0xFF, 0x34, 0xFF, 0xFF, 0x0F, 0x5D, 0xFF, 0xE8, 0x04, 0xE3, 0xFF, 0xC1, 0xDE,
0xFF, 0x9B, 0x00, 0x32, 0xC1, 0xF9, 0xEF, 0xA1, 0x10, 0xFC, 0x02, 0x32, 0x0D, 0x00, 0xFD, 0xA8,
0x00, 0xD0, 0x8D, 0xD8, 0xEF, 0x6D, 0x00, 0x1C, 0xFF, 0xFF, 0xDA, 0xC7, 0xFF, 0xFC, 0x17, 0x58,
0x1A, 0x40, 0x0B, 0xFD, 0xFF, 0x4F, 0x74, 0x00, 0x41, 0x00, 0xF1, 0xFF, 0x60, 0x08, 0x00, 0x1B,
0xF0, 0x08, 0x00, 0x31, 0xF1, 0xFF, 0x5F, 0x94, 0x00, 0xF3, 0x05, 0xFD, 0xFF, 0x4C, 0x1C, 0xFF,
0xFF, 0xCD, 0xBE, 0xFF, 0xF9, 0x12, 0x1C, 0xFF, 0xFF, 0x91, 0xE0, 0xEF, 0x65, 0x00, 0x1C, 0x19,
0x02, 0x0C, 0x08, 0x00, 0x04, 0x70, 0x00, 0xF0, 0x0D, 0x00, 0x48, 0xE1, 0xE9, 0x95, 0xFC, 0xFC,
0x30, 0x04, 0xE8, 0xFF, 0xD3, 0xCD, 0xFF, 0xFF, 0x30, 0x30, 0xFF, 0xFF, 0x27, 0x24, 0xFF, 0xFF,
0x30, 0x43, 0xFF, 0xFF, 0x11, 0x08, 0x00, 0x48, 0x44, 0xFF, 0xFF, 0x10, 0x08, 0x00, 0x04, 0x18,
0x00, 0x40, 0x30, 0xFF, 0xFF, 0x22, 0x08, 0x00, 0x50, 0x05, 0xF1, 0xFF, 0xCC, 0xC4, 0xF2, 0x1D,
0x40, 0x59, 0xE6, 0xED, 0x97, 0x08, 0x00, 0x02, 0x07, 0x19, 0x0D, 0x08, 0x00, 0x18, 0x06, 0x1C,
0x17, 0x60, 0x02, 0x14, 0xFC, 0xFC, 0x6B, 0xCE, 0x8F, 0x0B, 0xA1, 0xFB, 0xB8, 0x79, 0x14, 0xFF,
0xFF, 0x77, 0x00, 0x00, 0x14, 0xDC, 0x03, 0x0F, 0x06, 0x00, 0x11, 0x16, 0x00, 0x24, 0x06, 0xF1,
0x16, 0x54, 0xD4, 0xF7, 0xBB, 0x24, 0x00, 0x21, 0xFD, 0xFB, 0xB4, 0xFC, 0xCD, 0x01, 0x5F, 0xFF,
0xC6, 0x00, 0x8E, 0xD7, 0x15, 0x31, 0xFF, 0xFF, 0x73, 0x0A, 0x01, 0x00, 0x00, 0x93, 0xFF, 0xFF,
0x8B, 0x02, 0x00, 0x00, 0x02, 0x83, 0x9A, 0x18, 0xF1, 0x0B, 0x0C, 0x08, 0x63, 0xFF, 0xFF, 0x31,
0x67, 0xF5, 0x63, 0x00, 0xC7, 0xFF, 0x5B, 0x31, 0xFE, 0xF4, 0xAB, 0xFC, 0xFD, 0x20, 0x00, 0x5B,
0xD7, 0xFB, 0xD1, 0x57, 0x4C, 0x1D, 0x03, 0xD6, 0x17, 0x40, 0xB6, 0xFC, 0x9E, 0x00, 0xCB, 0x09,
0x14, 0xA0, 0x06, 0x00, 0x01, 0x56, 0x05, 0x78, 0x1C, 0x71, 0xE7, 0xFF, 0xDE, 0xA4, 0x12, 0x18,
0x00, 0x0F, 0x06, 0x00, 0x00, 0x11, 0xB4, 0x76, 0x09, 0xD4, 0x88, 0xFF, 0xFF, 0xDB, 0x32, 0x00,
0x17, 0xC6, 0xFC, 0xF5, 0x33, 0x00, 0x00, 0x7C, 0x02, 0xFF, 0x00, 0x2C, 0xFC, 0xFC, 0x24, 0x34,
0xFC, 0xFC, 0x1C, 0x2C, 0xFF, 0xFF, 0x24, 0x34, 0xFF, 0xFF, 0x08, 0x00, 0x19, 0xA0, 0x2A, 0x37,
0xFF, 0xFF, 0x1C, 0x19, 0xFF, 0xFF, 0xD0, 0xE7, 0xD6, 0x0B, 0x74, 0x9F, 0xFA, 0xC0, 0x67, 0xFF,
0xFF, 0x1C, 0x00, 0x01, 0xF0, 0x13, 0xAE, 0xFC, 0x8B, 0x00, 0xA3, 0xFC, 0x92, 0x80, 0xFF, 0xAF,
0x00, 0xC7, 0xFF, 0x63, 0x4E, 0xFF, 0xD2, 0x00, 0xE8, 0xFF, 0x33, 0x1D, 0xFF, 0xF4, 0x0C, 0xFF,
0xFB, 0x07, 0x01, 0xEC, 0xFF, 0x43, 0xFF, 0xD1, 0x7A, 0x08, 0x10, 0x88, 0x9F, 0x00, 0x50, 0x89,
0xFF, 0xCC, 0xFF, 0x6F, 0x55, 0x1B, 0x30, 0xFE, 0xFF, 0x3E, 0xFF, 0x0A, 0x10, 0xFF, 0x2E, 0x1B,
0x43, 0x02, 0xF3, 0xFF, 0xDC, 0xD0, 0x22, 0x01, 0x50, 0x00, 0xF0, 0x2C, 0x7F, 0xFC, 0x67, 0x00,
0xD6, 0xF9, 0x06, 0x3A, 0xFC, 0x96, 0x5B, 0xFF, 0x89, 0x07, 0xFC, 0xFF, 0x29, 0x5E, 0xFF, 0x71,
0x34, 0xFF, 0xAB, 0x2C, 0xFF, 0xFF, 0x50, 0x82, 0xFF, 0x49, 0x0E, 0xFF, 0xCC, 0x55, 0xFF, 0xFE,
0x76, 0xA6, 0xFF, 0x21, 0x00, 0xE7, 0xED, 0x7E, 0xF1, 0xCD, 0x9D, 0xCB, 0xF8, 0x03, 0x00, 0xC0,
0xFF, 0xB7, 0xC3, 0xA0, 0xC4, 0xF0, 0xD2, 0xB0, 0x15, 0x40, 0xF7, 0x94, 0x74, 0xF5, 0xF1, 0x1C,
0x80, 0x72, 0xFF, 0xFF, 0x65, 0x47, 0xFF, 0xFF, 0x83, 0x20, 0x1C, 0x60, 0xFF, 0x36, 0x1B, 0xFF,
0xFF, 0x5B, 0x03, 0x02, 0x65, 0xFE, 0x0A, 0x01, 0xEF, 0xFF, 0x34, 0xBC, 0x01, 0xF1, 0x05, 0x92,
0xFC, 0xB1, 0x00, 0x64, 0xFC, 0x99, 0x26, 0xFE, 0xFF, 0x26, 0xC8, 0xFF, 0x2F, 0x00, 0xB1, 0xFF,
0xBD, 0xFF, 0xC2, 0x36, 0x18, 0xF0, 0x1E, 0xFF, 0x55, 0x00, 0x00, 0x01, 0xD8, 0xFF, 0xE4, 0x05,
0x00, 0x00, 0x15, 0xF9, 0xFF, 0xE8, 0x08, 0x00, 0x00, 0x73, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x01,
0xD9, 0xFF, 0x98, 0xFF, 0xD4, 0x01, 0x3F, 0xFF, 0xC2, 0x10, 0xF3, 0xFF, 0x48, 0xA5, 0xFF, 0x63,
0x00, 0x8E, 0xFF, 0xBB, 0x0C, 0x02, 0x02, 0xC8, 0x02, 0xF0, 0x18, 0xC3, 0xFC, 0x75, 0x00, 0x67,
0xFC, 0xD2, 0x89, 0xFF, 0xA5, 0x00, 0x90, 0xFF, 0x9E, 0x4B, 0xFF, 0xD3, 0x00, 0xB8, 0xFF, 0x66,
0x10, 0xFE, 0xFB, 0x07, 0xE0, 0xFF, 0x2F, 0x00, 0xCE, 0xFF, 0x3A, 0xFF, 0xF5, 0x04, 0x00, 0x8F,
0xFF, 0x8F, 0xD3, 0x12, 0x51, 0x51, 0xFF, 0xE4, 0xFF, 0x89, 0x4E, 0x02, 0x61, 0xFF, 0x51, 0x00,
0x00, 0x00, 0xD5, 0x2C, 0x12, 0x40, 0x00, 0x98, 0xFF, 0xE3, 0x98, 0x00, 0xF1, 0x02, 0x75, 0xFF,
0xAB, 0x00, 0x00, 0x0B, 0xB6, 0xF0, 0xFF, 0x52, 0x00, 0x00, 0x10, 0xFD, 0xD5, 0x74, 0x01, 0x20,
0x02, 0x05, 0xC8, 0x01, 0x91, 0xFC, 0xFC, 0xD5, 0x1D, 0xA4, 0xA4, 0xE3, 0xFF, 0xBE, 0x3E, 0x22,
0x10, 0x5B, 0x38, 0x0B, 0x00, 0x1A, 0x05, 0x10, 0xC6, 0x94, 0x0C, 0x40, 0x2E, 0xFF, 0xFF, 0x2B,
0xDC, 0x09, 0x50, 0xC4, 0x00, 0x00, 0x0C, 0xF2, 0x24, 0x10, 0x70, 0x5D, 0xFF, 0xFF, 0xA6, 0x9C,
0x7F, 0x70, 0x6E, 0x05, 0x14, 0xD0, 0x50, 0x0B, 0xF4, 0x08, 0x00, 0x00, 0x7D, 0xE8, 0xFC, 0x4B,
0x00, 0x17, 0xFF, 0xFF, 0xCC, 0x31, 0x00, 0x35, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x38, 0xFF, 0xFF,
0x14, 0x06, 0x00, 0x11, 0x3A, 0x06, 0x00, 0x10, 0x4A, 0x1B, 0x0D, 0x20, 0x2A, 0xD4, 0xB5, 0x0C,
0xF0, 0x02, 0x44, 0xFF, 0xFC, 0x52, 0x00, 0x00, 0x02, 0x70, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x3E,
0xFF, 0xFF, 0x0B, 0xD4, 0x21, 0x2A, 0xFF, 0x14, 0x36, 0x00, 0xF0, 0x02, 0x32, 0xFF, 0xFF, 0x21,
0x00, 0x00, 0x13, 0xFE, 0xFF, 0xCA, 0x30, 0x00, 0x00, 0x76, 0xEB, 0xFF, 0x4C, 0xAC, 0x05, 0x02,
0x5C, 0x21, 0x53, 0xDA, 0xFC, 0x28, 0xDD, 0xFF, 0x03, 0x00, 0x17, 0xDE, 0x03, 0x00, 0x17, 0xDF,
0x03, 0x00, 0x1A, 0xE0, 0x03, 0x00, 0x05, 0xFC, 0x0B, 0x81, 0x43, 0xFC, 0xE9, 0x84, 0x00, 0x00,
0x2C, 0xC9, 0xF9, 0x13, 0x00, 0x47, 0x06, 0x10, 0x00, 0x4A, 0x21, 0x10, 0x44, 0x53, 0x1A, 0x06,
0x06, 0x00, 0x21, 0x02, 0xF6, 0x54, 0x0C, 0x80, 0xA3, 0xFF, 0xD7, 0x2F, 0x00, 0x00, 0x4D, 0xFA,
0x7C, 0x00, 0x40, 0xDC, 0xFF, 0x76, 0x02, 0x0F, 0x0C, 0x1A, 0x46, 0x2A, 0x00, 0x02, 0x3C, 0x00,
0x10, 0x1A, 0xF9, 0x12, 0x20, 0x2B, 0xC7, 0x75, 0x01, 0x42, 0x44, 0xFF, 0xED, 0x7D, 0x8C, 0x04,
0x12, 0x04, 0xEA, 0x36, 0xF4, 0x08, 0x21, 0x8C, 0x63, 0x07, 0x00, 0x22, 0x00, 0x26, 0xEF, 0xFF,
0xFF, 0xE4, 0xB4, 0xFD, 0x2E, 0x06, 0x7A, 0x17, 0x53, 0xCB, 0xF5, 0x7A, 0x01, 0x14, 0x1B, 0x22,
0x06, 0x06, 0x1F, 0x19, 0xFF, 0x02, 0x25, 0x54, 0x54, 0x54, 0x54, 0x07, 0x70, 0x55, 0x3C, 0x3C,
0x9B, 0x14, 0x70, 0x20, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x1F, 0x58, 0x9B, 0x8C, 0x8C, 0xC5, 0x14,
0xB4, 0x25, 0x0F, 0x01, 0x00, 0x45, 0x3F, 0x23, 0x23, 0x23, 0x18, 0x00, 0x02, 0x3E, 0xFF, 0xFF,
0xFF, 0x3B, 0x00, 0x0F, 0x23, 0x00, 0xFF, 0xE6, 0x0F, 0x36, 0x00, 0x03, 0x08, 0x01, 0x00, 0x0F,
0x14, 0x00, 0x01, 0x0F, 0x23, 0x00, 0x33, 0x0F, 0x8E, 0x00, 0x12, 0x16, 0x04, 0x01, 0x00, 0x04,
0xD2, 0x00, 0x06, 0x13, 0x00, 0x1F, 0x01, 0xBC, 0x02, 0xFF, 0xCC, 0x0F, 0x01, 0x00, 0xFF, 0xFF,
0xA1, 0xF0, 0x29, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x00, 0x28, 0x42, 0xFF, 0xFF, 0x18,
0xC6, 0x04, 0x21, 0xC7, 0x39, 0x10, 0x84, 0x9D, 0xC4, 0xFF, 0xFF, 0x04, 0x21, 0xEB, 0x5A, 0x10,
0x84, 0x08, 0x42, 0x04, 0x21, 0x10, 0x84, 0x14, 0xFD, 0x28, 0xFF, 0xFF, 0xFF, 0x1F, 0x04, 0x10,
0x84, 0x18, 0xC6, 0x1F, 0x04, 0xFF, 0xFF, 0x08, 0x42, 0x10, 0x84, 0x06, 0x00, 0x22, 0x18, 0xC6,
0x0A, 0x00, 0x00, 0x08, 0x00, 0xF0, 0x36, 0x84, 0x43, 0x00, 0x00, 0xA4, 0x43, 0x00, 0x00, 0xA8,
0x43, 0x00, 0x00, 0xC8, 0x43, 0x00, 0x00, 0xE8, 0x43, 0x00, 0x00, 0x08, 0x44, 0x00, 0x00, 0x28,
0x44, 0x00, 0x00, 0x48, 0x44, 0x00, 0x00, 0x68, 0x44, 0x00, 0x00, 0x88, 0x44, 0x00, 0x00, 0xA8,
0x44, 0x00, 0x00, 0xC8, 0x44, 0x00, 0x00, 0xE8, 0x44, 0x00, 0x00, 0xEC, 0x44, 0x00, 0x00, 0xF0,
0x44, 0x00, 0x00, 0xF4, 0x44, 0x00, 0x00, 0xF8, 0x44, 0x00, 0x00, 0xFC, 0x09, 0x2D, 0xF0, 0x16,
0x45, 0x00, 0x00, 0x04, 0x45, 0x00, 0x00, 0x24, 0x45, 0x00, 0x00, 0x44, 0x45, 0x00, 0x00, 0x64,
0x45, 0x00, 0x00, 0x68, 0x45, 0x00, 0x00, 0x6C, 0x45, 0x00, 0x00, 0x70, 0x45, 0x00, 0x00, 0x8C,
0x45, 0x00, 0x00, 0xA8, 0x45, 0x28, 0x3B, 0x0A, 0xF0, 0x3B, 0x22, 0xC4, 0x45, 0x08, 0x00, 0x20,
0xC8, 0x45, 0x8A, 0x03, 0x0C, 0xDC, 0x42, 0x02, 0xC4, 0x3B, 0x13, 0xCC, 0x24, 0x00, 0x13, 0xD8,
0x24, 0x00, 0x1B, 0x04, 0x44, 0x00, 0x13, 0xDC, 0x20, 0x00, 0x13, 0xE0, 0x20, 0x00, 0x1B, 0x07,
0x20, 0x00, 0x13, 0xE4, 0x20, 0x00, 0x13, 0xE8, 0x20, 0x00, 0x0C, 0x84, 0x00, 0x13, 0xEC, 0x20,
0x00, 0x13, 0xF0, 0x20, 0x00, 0x0C, 0x80, 0x00, 0x13, 0xF4, 0x20, 0x00, 0x2F, 0x00, 0x46, 0x60,
0x00, 0x03, 0x22, 0x04, 0x46, 0x08, 0x00, 0x2F, 0x08, 0x46, 0x60, 0x00, 0x03, 0x13, 0x0C, 0x20,
0x00, 0x2F, 0x10, 0x46, 0x60, 0x00, 0x03, 0x13, 0x14, 0x20, 0x00, 0x1F, 0x20, 0x60, 0x00, 0x04,
0x13, 0x24, 0x20, 0x00, 0x1F, 0x28, 0x60, 0x00, 0x04, 0x13, 0x2C, 0x20, 0x00, 0x17, 0x30, 0x60,
0x00, 0x13, 0x02, 0x5C, 0x00, 0x00, 0x74, 0x0A, 0x13, 0x06, 0x80, 0x3C, 0x2E, 0x09, 0x00, 0x3C,
0x00, 0x13, 0x34, 0x3C, 0x00, 0x13, 0x38, 0x3C, 0x00, 0x1B, 0x05, 0x20, 0x00, 0x13, 0x3C, 0x20,
0x00, 0x1F, 0x40, 0x7C, 0x00, 0x04, 0x13, 0x44, 0x20, 0x00, 0x1B, 0x48, 0xDC, 0x00, 0x1D, 0x02,
0x6C, 0x44, 0x11, 0x10, 0x14, 0x00, 0x2C, 0x4C, 0x46, 0xE4, 0x01, 0x06, 0x1C, 0x00, 0x1F, 0x54,
0x1C, 0x00, 0x08, 0x13, 0x5C, 0x1C, 0x00, 0xF0, 0x4A, 0x64, 0x46, 0x00, 0x00, 0x68, 0x46, 0x00,
0x00, 0x74, 0x46, 0x00, 0x00, 0x78, 0x46, 0x00, 0x00, 0x7C, 0x46, 0x00, 0x00, 0x80, 0x46, 0x00,
0x00, 0x8C, 0x46, 0x00, 0x00, 0x90, 0x46, 0x00, 0x00, 0x9C, 0x46, 0x00, 0x00, 0xA0, 0x46, 0x00,
0x00, 0xAC, 0x46, 0x00, 0x00, 0xB0, 0x46, 0x00, 0x00, 0xBC, 0x46, 0x00, 0x00, 0xC0, 0x46, 0x00,
0x00, 0xC4, 0x46, 0x00, 0x00, 0xC8, 0x46, 0x00, 0x00, 0xD4, 0x46, 0x00, 0x00, 0xD8, 0x46, 0x00,
0x00, 0xE4, 0x46, 0x00, 0x00, 0xE8, 0x46, 0x00, 0x00, 0xF4, 0x46, 0x00, 0x00, 0xF8, 0x46, 0x00,
0x00, 0xFC, 0x60, 0x00, 0xF1, 0x32, 0x47, 0x00, 0x00, 0x0C, 0x47, 0x00, 0x00, 0x10, 0x47, 0x00,
0x00, 0x1C, 0x47, 0x00, 0x00, 0x20, 0x47, 0x00, 0x00, 0x2C, 0x47, 0x00, 0x00, 0x30, 0x47, 0x00,
0x00, 0x3C, 0x47, 0x00, 0x00, 0x40, 0x47, 0x00, 0x00, 0x4C, 0x47, 0x00, 0x00, 0x50, 0x47, 0x00,
0x00, 0x5C, 0x47, 0x00, 0x00, 0x74, 0x47, 0x00, 0x00, 0x8C, 0x47, 0x00, 0x00, 0xA4, 0x47, 0x00,
0x00, 0xBC, 0x47, 0x00, 0x00, 0xD4, 0x47, 0xF8, 0x00, 0x1B, 0xE0, 0xAB, 0x03, 0x17, 0xE0, 0x04,
0x00, 0x06, 0x3C, 0x01, 0x3B, 0x60, 0x00, 0xE0, 0xAC, 0x3E, 0x09, 0x10, 0x00, 0x1F, 0x04, 0x48,
0x00, 0x14, 0x1F, 0x05, 0x38, 0x00, 0x24, 0x1F, 0x06, 0x38, 0x00, 0x0C, 0x1C, 0x07, 0x48, 0x00,
0x0B, 0xB0, 0x00, 0x1D, 0x08, 0x30, 0x00, 0xD9, 0xFE, 0xFF, 0x00, 0x00, 0x5F, 0x00, 0x62, 0x00,
0x22, 0x01, 0x4C, 0x00, 0x11, 0x18, 0x3F, 0x03, 0x26, 0x0C, 0x47, 0x00, 0x23, 0x00, 0x12, 0x30,
0x00, 0x1F, 0xFC, 0x30, 0x00, 0x04, 0x7D, 0xFB, 0xFF, 0x00, 0x00, 0xBD, 0x01, 0xED, 0x30, 0x00,
0x1F, 0xFA, 0x30, 0x00, 0x04, 0x11, 0xF9, 0x30, 0x00, 0x0C, 0x60, 0x00, 0xFF, 0x13, 0x10, 0x48,
0x00, 0x00, 0x20, 0x48, 0x00, 0x00, 0x30, 0x48, 0x00, 0x00, 0x40, 0x48, 0x00, 0x00, 0x50, 0x48,
0x00, 0x00, 0x60, 0x48, 0x00, 0x00, 0x70, 0x48, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x90, 0x48,
0x80, 0x40, 0x03, 0x08, 0x01, 0x00, 0x04, 0x08, 0x29, 0x2A, 0xA0, 0x48, 0x10, 0x00, 0x1B, 0xB0,
0x10, 0x00, 0x1B, 0xE8, 0x10, 0x00, 0x1B, 0xEC, 0x10, 0x00, 0x2A, 0x28, 0x49, 0x10, 0x00, 0x1B,
0x60, 0x10, 0x00, 0x13, 0x64, 0x10, 0x00, 0xC0, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
0x6F, 0x72, 0x6C, 0x64, 0xD7, 0x28, 0xF0, 0x26, 0x54, 0x6F, 0x75, 0x63, 0x68, 0x20, 0x74, 0x6F,
0x70, 0x2D, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x63, 0x72, 0x6F, 0x73, 0x73, 0x20, 0x69, 0x6E, 0x20,
0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x20, 0x75, 0x6E, 0x74, 0x69, 0x6C,
0x20, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x14, 0x1C, 0x05,
0x3C, 0x00, 0xBF, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x2D, 0x72, 0x69, 0x67, 0x68, 0x40, 0x00,
0x18, 0x06, 0x78, 0x00, 0x0F, 0x39, 0x00, 0x1B, 0xF0, 0x01, 0x59, 0x65, 0x73, 0x00, 0x53, 0x74,
0x61, 0x72, 0x74, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6E, 0x00
};
} // namespace gui
} // namespace eez

179
src/gui/document.h

@ -0,0 +1,179 @@
#pragma once
#include <eez/gui/data.h>
#include <eez/gui/widget.h>
namespace eez {
namespace gui {
enum DataEnum {
DATA_ID_NONE = 0,
DATA_ID_ALERT_MESSAGE = 1,
DATA_ID_TOUCH_CALIBRATION_POINT = 2,
DATA_ID_KEYPAD_TEXT = 3,
DATA_ID_KEYPAD_EDIT_UNIT = 4,
DATA_ID_KEYPAD_SIGN_ENABLED = 5,
DATA_ID_KEYPAD_UNIT_ENABLED = 6,
DATA_ID_KEYPAD_DOT_ENABLED = 7,
DATA_ID_KEYPAD_OPTION1_ENABLED = 8,
DATA_ID_KEYPAD_OPTION1_TEXT = 9,
DATA_ID_KEYPAD_OPTION2_ENABLED = 10,
DATA_ID_KEYPAD_OPTION2_TEXT = 11,
DATA_ID_KEYPAD_OPTION3_ENABLED = 12,
DATA_ID_KEYPAD_OPTION3_TEXT = 13,
DATA_ID_KEYPAD_MODE = 14,
DATA_ID_KEYPAD_OK_ENABLED = 15
};
void data_none(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_alert_message(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_touch_calibration_point(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_text(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_edit_unit(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_sign_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_unit_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_dot_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_option1_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_option1_text(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_option2_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_option2_text(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_option3_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_option3_text(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_mode(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
void data_keypad_ok_enabled(DataOperationEnum operation, const WidgetCursor &cursor, Value &value);
typedef void (*DataOperationsFunction)(DataOperationEnum operation, const WidgetCursor &widgetCursor, Value &value);
extern DataOperationsFunction g_dataOperationsFunctions[];
enum ActionsEnum {
ACTION_ID_NONE = 0,
ACTION_ID_YES = 1,
ACTION_ID_NO = 2,
ACTION_ID_CANCEL = 3,
ACTION_ID_EDIT = 4,
ACTION_ID_DRAG_OVERLAY = 5,
ACTION_ID_SCROLL = 6,
ACTION_ID_KEYPAD_KEY = 7,
ACTION_ID_KEYPAD_BACK = 8,
ACTION_ID_KEYPAD_UNIT = 9,
ACTION_ID_KEYPAD_OPTION1 = 10,
ACTION_ID_KEYPAD_OPTION2 = 11,
ACTION_ID_KEYPAD_OPTION3 = 12,
ACTION_ID_KEYPAD_SIGN = 13,
ACTION_ID_KEYPAD_OK = 14,
ACTION_ID_KEYPAD_CANCEL = 15,
ACTION_ID_TOGGLE_KEYPAD_MODE = 16,
ACTION_ID_KEYPAD_SPACE = 17
};
void action_yes();
void action_no();
void action_cancel();
void action_edit();
void action_drag_overlay();
void action_scroll();
void action_keypad_key();
void action_keypad_back();
void action_keypad_unit();
void action_keypad_option1();
void action_keypad_option2();
void action_keypad_option3();
void action_keypad_sign();
void action_keypad_ok();
void action_keypad_cancel();
void action_toggle_keypad_mode();
void action_keypad_space();
extern ActionExecFunc g_actionExecFunctions[];
enum FontsEnum {
FONT_ID_NONE = 0,
FONT_ID_SHADOW = 1,
FONT_ID_MEDIUM = 2,
FONT_ID_GUI_ICONS = 3
};
enum BitmapsEnum {
BITMAP_ID_NONE = 0
};
enum StylesEnum {
STYLE_ID_NONE = 0,
STYLE_ID_DEFAULT = 1,
STYLE_ID_INFO_ALERT = 2,
STYLE_ID_ERROR_ALERT = 3,
STYLE_ID_ERROR_ALERT_BUTTON = 4,
STYLE_ID_SELECT_ENUM_ITEM_POPUP_CONTAINER = 5,
STYLE_ID_SELECT_ENUM_ITEM_POPUP_CONTAINER_S = 6,
STYLE_ID_SELECT_ENUM_ITEM_POPUP_ITEM = 7,
STYLE_ID_SELECT_ENUM_ITEM_POPUP_ITEM_S = 8,
STYLE_ID_SELECT_ENUM_ITEM_POPUP_DISABLED_ITEM = 9,
STYLE_ID_SELECT_ENUM_ITEM_POPUP_DISABLED_ITEM_S = 10,
STYLE_ID_MENU_WITH_BUTTONS_MESSAGE = 11,
STYLE_ID_MENU_WITH_BUTTONS_CONTAINER = 12,
STYLE_ID_MENU_WITH_BUTTONS_BUTTON = 13,
STYLE_ID_FPS_GRAPH = 14,
STYLE_ID_BACKGROUND = 15,
STYLE_ID_TOUCH_CALIBRATION = 16,
STYLE_ID_NOTE_M = 17,
STYLE_ID_TOUCH_CALIBRATION_POINT = 18,
STYLE_ID_BUTTON = 19
};
enum ThemesEnum {
THEME_ID_DEFAULT = 0
};
enum ColorsEnum {
COLOR_ID_TRANSPARENT = 65535,
COLOR_ID_BACKGROUND = 0,
COLOR_ID_BACKDROP = 1,
COLOR_ID_TEXT = 2,
COLOR_ID_TEXT_INACTIVE = 3,
COLOR_ID_DARK_TEXT = 4,
COLOR_ID_BORDER = 5,
COLOR_ID_ACTIVE_BACKGROUND = 6,
COLOR_ID_BUTTON_TEXT = 7,
COLOR_ID_BUTTON_BACKGROUND = 8,
COLOR_ID_BUTTON_ACTIVE_BACKGROUND = 9,
COLOR_ID_BUTTON_BORDER = 10,
COLOR_ID_BUTTON_DISABLED_TEXT = 11,
COLOR_ID_BUTTON_DISABLED_BACKGROUND = 12,
COLOR_ID_BUTTON_DISABLED_BORDER = 13,
COLOR_ID_ERROR = 14,
COLOR_ID_NOTE = 15,
COLOR_ID_SWITCH_WIDGET_COLOR = 16,
COLOR_ID_SWITCH_WIDGET_BACKGROUND_ON = 17,
COLOR_ID_SWITCH_WIDGET_BACKGROUND_OFF = 18,
COLOR_ID_SWITCH_WIDGET_BORDER = 19,
COLOR_ID_SLIDER_WIDGET_COLOR = 20,
COLOR_ID_SLIDER_WIDGET_BACKGROUND = 21,
COLOR_ID_DROP_DOWN_LIST_COLOR = 22,
COLOR_ID_DROP_DOWN_LIST_COLOR_DISABLED = 23,
COLOR_ID_DROP_DOWN_LIST_BACKGROUND = 24,
COLOR_ID_DROP_DOWN_LIST_BORDER = 25,
COLOR_ID_DROP_DOWN_LIST_ACTIVE_BACKGROUND = 26,
COLOR_ID_TEXT_INPUT_COLOR = 27,
COLOR_ID_TEXT_INPUT_COLOR_DISABLED = 28,
COLOR_ID_TEXT_INPUT_BACKGROUND = 29,
COLOR_ID_TEXT_INPUT_ACTIVE_BACKGROUND = 30,
COLOR_ID_TEXT_INPUT_BORDER = 31,
COLOR_ID_CUSTOM_UNDEFINED = 32,
COLOR_ID_CUSTOM_000000 = 33,
COLOR_ID_CUSTOM_00FF1E = 34,
COLOR_ID_CUSTOM_FFFFFF = 35,
COLOR_ID_CUSTOM_00FF00 = 36
};
enum PagesEnum {
PAGE_ID_NONE = 0,
PAGE_ID_MAIN = 1,
PAGE_ID_TOUCH_CALIBRATION = 2,
PAGE_ID_TOUCH_CALIBRATION_YES_NO = 3
};
extern const uint8_t assets[9722];
} // namespace gui
} // namespace eez

84
src/main.cpp

@ -0,0 +1,84 @@
#include <eez/gui/gui.h>
#include <eez/gui/thread.h>
#ifdef __EMSCRIPTEN__
void startEmscripten();
#endif
void init() {
eez::initMemory();
eez::initAllocHeap(eez::ALLOC_BUFFER, eez::ALLOC_BUFFER_SIZE);
eez::gui::display::turnOn();
eez::gui::startThread();
}
int main() {
#ifdef __EMSCRIPTEN__
startEmscripten();
#else
init();
while (!eez::g_shutdown) {
osDelay(1);
}
#endif
}
#ifdef __EMSCRIPTEN__
#include <stdio.h>
#include <emscripten.h>
extern void eez_system_tick();
static int g_initialized = false;
// clang-format off
void mountFileSystem() {
EM_ASM(
FS.mkdir("/min_eez_sample");
FS.mount(IDBFS, {}, "/min_eez_sample");
//Module.print("start file sync..");
//flag to check when data are synchronized
Module.syncdone = 0;
FS.syncfs(true, function(err) {
assert(!err);
//Module.print("end file sync..");
Module.syncdone = 1;
});
, 0);
}
// clang-format on
EM_PORT_API(void) mainLoop() {
if (emscripten_run_script_int("Module.syncdone") == 1) {
if (!g_initialized) {
g_initialized = true;
init();
} else {
eez_system_tick();
// clang-format off
EM_ASM(
if (Module.syncdone) {
//Module.print("Start File sync..");
Module.syncdone = 0;
FS.syncfs(false, function(err) {
assert(!err);
//Module.print("End File sync..");
Module.syncdone = 1;
});
}
, 0);
// clang-format on
}
}
}
void startEmscripten() {
mountFileSystem();
}
#endif

111
src/platform/simulator/emscripten/index.html

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Min EEZ Sample</title>
<link rel="stylesheet" href="main.css" />
</head>
<body>
<div id="content">
<div id="canvas-container">
<canvas id="canvas" oncontextmenu="event.preventDefault()"></canvas>
</div>
</div>
<script>
var worker = new Worker("min_eez_sample.js");
const WIDTH = 480;
const HEIGHT = 272;
const canvas = document.getElementById("canvas");
canvas.width = WIDTH;
canvas.height = HEIGHT;
let ctx = canvas.getContext("2d");
let pointerEvents = [];
let wheelDeltaY = 0;
let wheelClicked = 0;
worker.onmessage = function (e) {
if (e.data.screen) {
var imgData = new ImageData(e.data.screen, WIDTH, HEIGHT);
ctx.putImageData(imgData, 0, 0);
}
worker.postMessage({
wheel: {
deltaY: wheelDeltaY,
clicked: wheelClicked,
},
pointerEvents,
});
wheelDeltaY = 0;
wheelClicked = 0;
pointerEvents = [];
};
function sendPointerEvent(event) {
var bbox = canvas.getBoundingClientRect();
pointerEvents.push({
x: (event.clientX - bbox.left) * (canvas.width / bbox.width),
y: (event.clientY - bbox.top) * (canvas.height / bbox.height),
pressed: event.buttons == 1 ? 1 : 0,
});
event.preventDefault();
event.stopPropagation();
}
canvas.addEventListener(
"pointerdown",
(event) => {
if (event.buttons == 4) {
wheelClicked = 1;
}
canvas.setPointerCapture(event.pointerId);
sendPointerEvent(event);
},
true
);
canvas.addEventListener(
"pointermove",
(event) => {
sendPointerEvent(event);
},
true
);
canvas.addEventListener(
"pointerup",
(event) => {
canvas.releasePointerCapture(event.pointerId);
sendPointerEvent(event);
},
true
);
canvas.addEventListener(
"pointercancel",
(event) => {
canvas.releasePointerCapture(event.pointerId);
sendPointerEvent(event);
},
true
);
document.addEventListener(
"wheel",
(event) => {
wheelDeltaY += -event.deltaY;
},
true
);
</script>
</body>
</html>

31
src/platform/simulator/emscripten/main.css

@ -0,0 +1,31 @@
body {
margin: 0;
padding: 0;
overflow: hidden;
}
#content {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
#canvas-container {
flex-grow: 1;
flex-shrink: 0;
text-align: center;
margin-top: 10px;
display: flex;
align-items: center;
justify-content: center;
}
#canvas {
margin: 0;
border: none;
padding: 0;
}

35
src/platform/simulator/emscripten/pre.js

@ -0,0 +1,35 @@
Module = {};
Module.onRuntimeInitialized = function() {
postMessage(0);
}
Module.print = function (args) {
console.log(args);
}
const WIDTH = 480;
const HEIGHT = 272;
onmessage = function (e) {
if (e.data.wheel.deltaY != 0 || e.data.wheel.clicked != 0) {
Module._onMouseWheelEvent(e.data.wheel.deltaY, e.data.wheel.clicked);
}
for (let i = 0; i < e.data.pointerEvents.length; i++) {
const pointerEvent = e.data.pointerEvents[i];
Module._onPointerEvent(pointerEvent.x, pointerEvent.y, pointerEvent.pressed);
}
Module._mainLoop();
var buf_addr = Module._getSyncedBuffer();
if (buf_addr != 0) {
var uint8ClampedArray = new Uint8ClampedArray(Module.HEAPU8.subarray(buf_addr, buf_addr + WIDTH * HEIGHT * 4));
postMessage({
screen: uint8ClampedArray
});
} else {
postMessage(0);
}
}

BIN
src/platform/simulator/win32/icon.rc

Binary file not shown.
Loading…
Cancel
Save